【发布时间】:2015-01-21 14:25:06
【问题描述】:
我正在为字符串添加前缀,例如:com 应该给我c co com。
我知道在 printf("%.5s",string) 中打印一个字符来打印前五个值。我想在一个循环而不是 5 中执行此操作,如何将其替换为 i,这是一个递增值,类似于 printf("%.is",string)。我怎样才能得到这个?
【问题讨论】:
我正在为字符串添加前缀,例如:com 应该给我c co com。
我知道在 printf("%.5s",string) 中打印一个字符来打印前五个值。我想在一个循环而不是 5 中执行此操作,如何将其替换为 i,这是一个递增值,类似于 printf("%.is",string)。我怎样才能得到这个?
【问题讨论】:
在printf 格式说明符中,所有字段宽度(点之前)和精度(点之后)都可以用星号* 给出。对于每个星号,在打印对象之前必须有一个额外的 int 参数。
所以,对于你的问题:
printf("%.*s", i, string);
注意附加参数必须是int,所以如果你有其他整数类型,你应该强制转换它:
size_t len = strlen(len);
if (len > 2) printf("%.*s", (int) (len - 2), string);
【讨论】:
这是实现您想要的最简单的方法。
printf("%.*s\n", i, string);
如果你想生成格式字符串,你也可以这样做
char format[100]; /* the size should be estimated by you */
snprintf(format, sizeof(format), "%%.%ds", i);
printf(format, string)
检查snprintf()返回值以确保字符串没有被截断,如果你为格式字符串选择了一个合理的大小,这不太可能,但你还是应该检查一下。
以上,格式说明符的意思
"%"
"."
"%d"
"s"
因此生成的字符串将是您需要传递给printf() 的格式字符串。
【讨论】:
sizeof(int)*CHAR_BIT / 3 对于十进制的INT_MAX 就足够了,所以在这种情况下,缓冲区char format[3 + sizeof(int)*CHAR_BIT/3 + 2]; 就足够了。
试试这个:
char s[] = "com";
for(size_t i = 1; i <= strlen(s); i++)
{
for(int j = 0; j < i; j++)
printf("%c", s[j]);
printf(" ");
}
【讨论】:
sizeof(或strlen(...) + 1,但可能把它放在循环之外)得到c co com 。
strlen()。将其存储在某处,而不是在每次迭代时调用它。