temp ....在调用sprintf或snprintf时使用错误。
如果由于调用sprintf()或snprintf()而重叠的对象之间发生了复制,则结果是未定义的。
答案 0 :(得分:1)
即使使用-Wall -Wextra -pedantic
:
#include "stdio.h"
int main (void) {
char xx[1000] = "hello";
sprintf (xx, "xyzzy plugh %s", xx);
printf ("%s\n", xx);
return 0;
}
然而,从输出中可以看出这被认为是一个坏主意的原因。而不是得到:
xyzzy plugh hello
正如一个普通人所预料的那样,你实际得到:
xyzzy plugh xyzzy plugh
但是,与所有未定义的行为一样,您的里程可能会有所不同。
最终参考是C99标准,7.19.6.6 The sprintf function
部分,其中指出:
sprintf函数等效于fprintf,除了输出被写入数组(由参数s指定)而不是流。在写入的字符末尾写入空字符;它不计入返回值的一部分。如果在重叠的对象之间进行复制,则行为未定义。
C ++标准(好吧,实际上是C ++ 0x 草案,但它现在肯定会在任何一天到来,希望 - 来吧,伙计们,让它 out 那里)引用它,因为它将C标准的一部分合并为已弃用的功能。