2013-02-06 22 views
0

以下的输出 “STR-3,” 不过,我希望它是 “STR-2,STR-3,”为什么下面仅包含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); 
} 
+3

如果源和目的地重叠,则是UB –

回答

6

snprintf C标准(C99,7.19.6.5)的描述表示:

如果进行复制操作的是重叠的对象之间,该行为理解过程音响定义。

这是因为str既用作输入又用作输出。

相同的限制适用于sprintf。事情发生在你身上的事实只是一个意外,因为未定义的行为可能会发生。

相关问题