以下代码:
printf("%d. %-10s:", 1, "Test");
生成此输出:
1. Test :// 14 characters long
我想要整个格式`%d的输出长度。 %-10s:"恰好是这样的10个字符:
1. Test: // 10 characters
注意:
数字长度不一,可能是1或100,所以我无法从输出中推断出它的长度。
我该怎么做?
答案 0 :(得分:3)
您需要使用两个步骤:
char buffer[20];
snprintf(buffer, sizeof(buffer), "%d. %s:", 1, "Test");
printf("%-*s", 10, buffer);
snprintf()
操作会在1. Test:
中为您提供字符串buffer
;请注意,它在输出中包含:
,并假设字符串"Test"
上没有尾随空白)。 printf()
操作将字符串左对齐(-
)格式化为(至少)10(格式中的*
和参数列表中的10)的长度到标准输出。据推测,在同一行输出后会出现其他内容;否则,空白填充没有明显的意义。
有关完整信息,请参阅:
这包括*printf()
函数族的基本操作(但不列出v*printf()
或*wprintf()
函数族的接口。
问题和上面答案中的代码都是用常量完成的。更现实的情况是:
void format_item(int number, const char *text, int width)
{
char buffer[width+1]; // C99 VLA
snprintf(buffer, sizeof(buffer), "%d. %s:", number, text);
printf("%-*s", width, buffer);
}
请注意,如果数字加上字符串太长,此代码会截断格式化数据。如果你的工作有点困难(例如在1
的定义中添加超过width
到buffer
- 可能会增加15而不是1)。
你可以写:
format_item(1, "Test", 10);
或:
char *str_var = …some function call, perhaps…
int item = 56;
format_item(++item, str_var, 20);
等