4

所以,我有点受阻。根据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 中打印两半),我想知道为什么精度被忽略了。

4

1 回答 1

19

您不是在设置精度,而是在设置字段宽度精度始终以.格式规范中的a开头。

printf("test: %.3s\n", test);
于 2009-09-25T15:51:25.437 回答