sprintf函数用法举例
1 #include<stdio.h> 2 int main() 3 { 4 //1.连接字符串 5 char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; 6 char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'}; 7 char buffer[200]; 8 sprintf(buffer, "%.*s%.*s\n", sizeof(a1), a1, sizeof(a2), a2); printf("%s\n", buffer); 9 10 //2.data and place them in the string named buffer.(使用sprintf将各种数据格式化后置于字符数组buffer中) 11 char str[] = "computer", c = 'L'; 12 int i = 35, j; 13 float fp = 1.7320534f; 14 //格式化并打印各种数据到buffer 15 j = sprintf(buffer, "String:%s", str); 16 j += sprintf(buffer + j, "Character:%c", c); 17 j += sprintf(buffer + j, "Integer:%d", i); 18 j += sprintf(buffer + j, "Real:%f", fp); //sprintf返回被写入buffer的字节数j 19 //Note:sprintf is deprecated; consider using sprintf_s instead 20 printf("Output:\n%s\ncharacter count = %d\n\n", buffer, j); //结束字符‘\0’不计入内 21 22 //3.格式化数字字符串(大多数场合可以替代itoa函数) 23 short m = -1; int n = 100; 24 sprintf(buffer, "%-4d%4d", 123, 4567); printf("%s\n", buffer);//产生"123 4567"其中123左对齐 25 sprintf(buffer, "%08x", 4567); printf("%s\n", buffer); //产生:"000011D7",小写16进制,宽度占8个位置,左边补0 的等宽格式 26 sprintf(buffer, "%#04X", (unsigned short)m); printf("%s\n", buffer);//sprintf是个变参函数,除了前面两个参数之外,后面的参数要保证类型安全 27 sprintf(buffer, "%.2f", (double)n); printf("%s\n", buffer); //同上 28 return 0; 29 }
分析:
1.(1)类比打印浮点数的"%m.nf",m 表示占用宽度(字符串长度不足时补空格,超出了则按照实际宽度打印),n表示从相应的字符串中最多取用的字符数,当然也可以前后都只取部分字符。
(2)如果希望这些格式控制符中指定长度的信息数字是动态的,而不是静态指定的(许多时候程序要到运行时才清楚到底需要取字符数组中的几个字符),而sprintf采用"*"来占用一个本来需要一个指定宽度或精度的常数数字的位置,而实际的宽度或精度可以和其它被打印的变量一样被提供出来。
3.如果m不进行强制转换,那么函数没有办法仅仅通过一个"%X"得知当初函数调用前参数压栈时被压进来的到底是个4 字节的整型数还是个2 字节的短整型数,则采取统一4字节的处理方式,导致参数压栈时符号扩展成32位的整数-1,由于打印时4个位置不够,会把32位整数-1的8位16进制都打印出来。
本文参考链接:
亲爱的读者:如果觉得本文对你有所帮助,请点击推荐,分享给其他人!