2
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);
}

How output looks: a => bb => aaa => bbbb

I want the output looks: a => ba => aba => baba

4

2 回答 2

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

于 2012-11-21T23:24:24.500 回答
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);
}
于 2012-11-22T00:10:34.150 回答