] = {}; char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'}; // sprintf(s, "%s%s", a1, a2); //Don't do that!乱码 // sprintf(s, "%7s%7s", a1, a2); //乱码 sprintf(s, "%.7s%.7s", a1, a2); //输出:"ABCDEFGHIJKLMN" sprintf(s, "%.6s%.5s", a1, a2); //输出:"ABCDEFHIJKL"
%m.ns ≈ %m.nf:
m 表示占用宽度(字符串长度不足时补空格,超出了则按照实际宽度打印);
n 表示从相应的字符串中最多取用的字符数, 用的多。
尽量使用”%.ns”的形式指定最大字符数。
动态指定取用字符长度:sprintf 采用“*”来占位[指定宽度或精度的常数数字的位置]。
于是,上面的例子可以变成:
sprintf(s, , a1, , a2);
或者:
sprintf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2);
实际上,前面介绍的打印字符、整数、浮点数等都可以动态指定那些常量值,比如:
sprintf(s, , 'A'); //输出:"65 " sprintf(s, , ); //输出:"0X000080","#"产生0X sprintf(s, , , 3.1415926); //输出:" 3.14"
打印地址信息
调试程序时,想查看某些变量或者成员的地址。由于地址或者指针也不过是个32 位的数,可以用打印无符号整数的”%u”打印:
sprintf(s, "%u", &i);
用16 进制显示地址:
sprintf(s, "%08X", &i);
地址打印,sprintf 提供了专门的”%p”:
sprintf(s, "%p", &i);
≈
sprintf(s, * sizeof(void *), &i);