printf 似乎忽略了字符串精度
所以,我有点难受。根据我系统上的 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
When I think I should be getting
test: one test: two test: three test: four
Am IDothing bad, 或者手册页只是在骗我?
仅供参考:我知道我(通常)可以破解字符串,并插入临时 '\0'
来终止字符串(除非它是 char const *
,如下所示,我必须复制它),但它是一个 PITA(特别是如果我试图在同一个 printf 中打印某些东西的两半),并且我想知道为什么精度被忽略。
So, I'm a bit stymied. According to man 3 printf
on my system, the string format "%5s"
should use the specified precision to limit the number of characters printed from the string argument given.
% 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.
But my test code doesn't confirm this:
#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;
}
It outputs
test: one two three four test: two three four test: three four test: four
When I think I should be getting
test: one test: two test: three test: four
Am I doing something wrong, or is the man page just lying to me?
FYI: I know I could (in general) hack the string, and insert temporary '\0'
to terminate the string (except when it's a char const *
, like here, I'd have to copy it instead), but it's a PITA (especially if I'm trying to print two halves of something in the same printf), and I want to know why the precision is being ignored.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您没有设置精度,而是设置字段宽度。在格式规范中,精度始终以
.
开头。You're not setting the precision, you're setting the field width. The precision always starts with a
.
in the format specification.