C 其他输出转换
本节描述了printf的杂项转换。
‘%c’转换打印一个字符。如果没有’l’修饰符,则int参数首先被转换为无符号字符。然后,如果用于宽流函数,字符将被转换为相应的宽字符。’-’标志可用于指定字段中的左对齐,但没有定义其他标志,也没有给定精度或类型修饰符。例如:
printf ("%c%c%c%c%c", 'h', 'e', 'l', 'l', 'o');
打印‘hello’。
如果有’l’修饰符,参数应该是wint_t类型的。如果在多字节函数中使用,宽字符在添加到输出之前会被转换为多字节字符。在这种情况下,可以生成多个输出字节。
‘%s’转换打印一个字符串。如果没有’l’修饰符,对应的参数必须是char (或const char )类型。如果在宽流函数中使用,字符串首先被转换为宽字符字符串。可以指定一个精度来表示要写入的最大字符数;否则,字符串中的字符(不包括终止空字符)将被写入输出流。’-’标志可用于指定字段中的左对齐,但为此转换没有定义其他标志或类型修饰符。例如:
printf ("%3s%-6s", "no", "where");
打印‘ nowhere ’。
如果有’l’修饰符,参数应该是wchar_t(或const wchar_t *)类型。
如果你不小心将null指针作为’%s’转换的参数,GNU C库会将其打印为’(null)’。我们认为这比崩溃更有用。但是故意传递null参数并不是好的做法。
’%m’转换打印与errno中的错误代码对应的字符串。参见错误消息。因此:
fprintf (stderr, "can't open `%s': %m\n", filename);
等同于:
fprintf (stderr, "can't open `%s': %s\n", filename, strerror (errno));
‘%m’转换可以使用’#‘标志打印由strerrorname_np提供的错误常量。’%m’和’%#m’都是GNU C库扩展。
’%p’转换打印指针值。对应的参数必须是void *类型。在实践中,你可以使用任何类型的指针。
在GNU C库中,非空指针以无符号整数的形式打印,就像使用了’%#x’转换一样。空指针打印为’(nil)’。(在其他系统中,指针可能以不同的方式打印。)
例如:
printf ("%p", "testing");
打印‘0x’后跟一个十六进制数——字符串常量”testing”的地址。它不打印单词’testing’。
你可以在’%p’转换中使用’-’标志来指定左对齐,但没有其他标志、字段宽度或精度。
’%n’转换与其他输出转换不同。它使用必须是一个指向int的指针的参数,而不是打印任何东西,而是将此调用到目前为止打印的字符数存储在该位置。’h’和’l’类型修饰符允许指定参数是short int 或long int 而不是int *,但没有标志、字段宽度或精度被允许。
例如,
int nchar;
printf ("%d %s%n\n", 3, "bears", &nchar);
打印:
3 bears 并将nchar设置为7,因为‘3 bears’是七个字符。
‘%%’转换打印字面上的’%’字符。此转换不使用参数,并且没有标志、字段宽度、精度或类型修饰符被允许。