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 回答