所以,我有点难受。根据man 3 printf
在我的系统上,字符串格式"%5s"
应使用指定的精度来限制从给定字符串参数打印的字符数。
% man 3 printf
PRINTF(3) BSD Library Functions Manual PRINTF(3)
NAME
printf, fprintf, sprintf, snprintf, asprintf, vprintf, vfprintf,
vsprintf, vsnprintf, vasprintf -- formatted output conversion
...
s The char * argument is expected to be a pointer to an array of
character type (pointer to a string). Characters from the array
are written up to (but not including) a terminating NUL charac-
ter; if a precision is specified, no more than the number
specified are written. If a precision is given, no null
character need be present; if the precision is not specified, or
is greater than the size of the array, the array must contain a
terminating NUL character.
但我的测试代码并没有证实这一点:
#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;
}
它输出
test: one two three four
test: two three four
test: three four
test: four
当我认为我应该得到
test: one
test: two
test: three
test: four
我做错了什么,还是手册页只是在骗我?
仅供参考:我知道我(一般来说)可以破解字符串,并插入临时的'\0'
终止字符串(除非它是char const *
,就像这里一样,我必须复制它),但它是一个 PITA(特别是如果我试图在同一个 printf 中打印某些东西的两半),并且我想知道为什么精度被忽略。