0

次の出力は「str-3」ですが、「str-2,str-3」になると思います。

snprintf を sprintf に変更すると、期待どおりに動作します。snprintf と sprintf は同じように振る舞うべきではありませんか?

int main (int argc, char **argv)
{
    char str[64];

    str[0] = '\0';

    snprintf(str, 64, "%s%s,", str, "str-2");
    snprintf(str, 64, "%s%s,", str, "str-3");

    printf("%s\n",str);
}
4

1 に答える 1

7

snprintfC標準(C99、7.19.6.5)の説明には次のように書かれています:

重複するオブジェクト間でコピーが行われる場合、動作は未定義です。

strが入力と出力の両方として使用されるため、これがここで発生することです。

にも同じ制限が適用されsprintfます。未定義の動作で発生する可能性があるため、たまたまうまくいったという事実は単なる偶然です。

于 2013-02-06T18:01:38.653 に答える