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 }
View Code

分析:
  1.(1)类比打印浮点数的"%m.nf",m 表示占用宽度(字符串长度不足时补空格,超出了则按照实际宽度打印),n表示从相应的字符串中最多取用的字符数,当然也可以前后都只取部分字符。
   (2)如果希望这些格式控制符中指定长度的信息数字是动态的,而不是静态指定的(许多时候程序要到运行时才清楚到底需要取字符数组中的几个字符),而sprintf采用"*"来占用一个本来需要一个指定宽度或精度的常数数字的位置,而实际的宽度或精度可以和其它被打印的变量一样被提供出来。
  3.如果m不进行强制转换,那么函数没有办法仅仅通过一个"%X"得知当初函数调用前参数压栈时被压进来的到底是个4 字节的整型数还是个2 字节的短整型数,则采取统一4字节的处理方式,导致参数压栈时符号扩展成32位的整数-1,由于打印时4个位置不够,会把32位整数-1的8位16进制都打印出来。

本文参考链接:

 http://baike.baidu.com/link?url=5mhOwQqslSj9dDaAIv2YqSIX4I7WGkNT1ix61dVCPkpwZhFr8P4YHt7AlPeZn6NR85Atrikq-nnwluvW4xR-Nq

 posted on 2016-03-22 23:08  tostring_char  阅读(623)  评论(0编辑  收藏  举报