所以,我有点受阻。根据man 3 printf
我的系统,字符串格式"%5s"
应该使用指定的精度来限制从给定的字符串参数打印的字符数。
% 人 3 打印 PRINTF(3) BSD 库函数手册 PRINTF(3) 姓名 printf, fprintf, sprintf, snprintf, asprintf, vprintf, vfprintf, vsprintf, vsnprintf, vasprintf -- 格式化输出转换 ... s char * 参数应该是一个指向数组的指针 字符类型(指向字符串的指针)。数组中的字符 被写入(但不包括)一个终止 NUL 字符 三; 如果指定了精度,则不超过数字 指定的都是写的。如果给出精度,则不为空 角色需要存在;如果未指定精度,或 大于数组的大小,数组必须包含一个 终止 NUL 字符。
但我的测试代码并没有证实这一点:
#include <stdio.h>
int main()
{
char const * test = "one two three four";
printf("test: %3s\n", test);
printf("test: %3s\n", test+4);
printf("test: %5s\n", test+8);
printf("test: %4s\n", test+14);
return 0;
}
它输出
测试:一二三四 测试:二三四 测试:三四 测试:四
当我认为我应该得到
测试:一 测试:两个 测试:三 测试:四
我做错了什么,还是手册页只是在骗我?
仅供参考:我知道我可以(通常)破解字符串,并插入临时'\0'
来终止字符串(除非它是 a char const *
,就像这里一样,我必须复制它),但它是一个 PITA(特别是如果我试图在同一个 printf 中打印两半),我想知道为什么精度被忽略了。