以下输出是"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);
}
Run Code Online (Sandbox Code Playgroud)
的描述snprintf在C标准(C99,7.19.6.5)表示:
如果在重叠的对象之间进行复制,则行为未定义.
这就是这里发生的事情,因为str它既用作输入又用作输出.
同样的限制适用于sprintf.它碰巧适合你的事实只是一个意外,就像未定义的行为一样.