char symbols[16] = "";
int index = 0;
while (1)
{
if (index % 2)
snprintf(symbols, sizeof symbols, "a%s", symbols);
else
snprintf(symbols, sizeof symbols, "b%s", symbols);
index++;
printf("%s\n", symbols);
}
输出的外观:a => bb => aaa => BBBB
我希望输出看起来:a => ba => aba =>巴巴
答案 0 :(得分:7)
这是未定义的行为。从C99标准部分 7.19.6.5 snprintf函数:
snprintf函数等效于fprintf,但输出被写入 数组(由参数s指定)而不是流。如果n为零,则不写任何内容, 和s可以是空指针。否则,超出n-1的输出字符是 丢弃而不是写入数组,并在末尾写入空字符 实际写入数组的字符。 如果在对象之间进行复制 重叠,行为未定义。
您需要复制symbols
作为snprintf()
来电中的参数:
char symbols[16] = "";
char symbols_copy[16];
int index = 0;
while (index++ < 15)
{
memcpy(symbols_copy, symbols, sizeof(symbols));
if (index % 2)
snprintf(symbols, sizeof symbols, "a%s", symbols_copy);
else
snprintf(symbols, sizeof symbols, "b%s", symbols_copy);
printf("%s\n", symbols);
}
请参阅演示http://ideone.com/GvnW7D。
答案 1 :(得分:0)
当然也可以在没有snprintf
的情况下完成:
char symbols[16] = "";
for(int i=0; i<15; ++i) {
memmove(&symbols[1], symbols, i);
if (i % 2) {
symbols[0] = 'a';
} else {
symbols[0] = 'b';
}
printf("%s\n", symbols);
}