snprintf()不适用于就地修改字符串

时间:2012-11-21 23:21:44

标签: c string char concatenation

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 =>巴巴

2 个答案:

答案 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);
}
相关问题