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

Pet*_*ryl 2 c string concatenation char

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);
}
Run Code Online (Sandbox Code Playgroud)

输出如何显示:a => bb => aaa => bbbb

我希望输出看起来:a => ba => aba => baba

hmj*_*mjd 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);
}
Run Code Online (Sandbox Code Playgroud)

请参阅演示http://ideone.com/GvnW7D.