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

出力の外観:a => bb => aaa => bbbb

出力が次のようになりたい:a => ba => aba => baba

4

2 に答える 2

7

これは未定義の動作です。C99標準セクション7.19.6.5からsnprintf関数

snprintf関数はfprintfと同等ですが、出力がストリームではなく配列(引数sで指定)に書き込まれる点が異なります。nがゼロの場合、何も書き込まれず、sはnullポインターである可能性があります。それ以外の場合、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 に答える