C sprintf的奇怪输出,是什么导致的?

C sprintf的奇怪输出,是什么导致的?,c,printf,C,Printf,我试图以这种方式使用sprintf: DebugLogMsg10 (DebugStruct, sizeThreadID, "szLoginHeadString before:\r\n%s",szLoginHeadString ); sprintf (szLoginHeadString, "<br/>%s", szLoginHeadString); DebugLogMsg10 (DebugStruct, sizeThreadID, "

我试图以这种方式使用sprintf:

        DebugLogMsg10 (DebugStruct, sizeThreadID, "szLoginHeadString before:\r\n%s",szLoginHeadString );

        sprintf (szLoginHeadString, "<br/>%s", szLoginHeadString);

        DebugLogMsg10 (DebugStruct, sizeThreadID, "szLoginHeadString after:\r\n%s",szLoginHeadString ); 
DebugLogMsg10(DebugStruct,sizeThreadID,“szLoginHeadString之前:\r\n%s”,szLoginHeadString);
sprintf(szLoginHeadString,“
%s”,szLoginHeadString); DebugLogMsg10(DebugStruct,sizeThreadID,“szLoginHeadString在:\r\n%s之后”,szLoginHeadString);
我不理解结果字符串

[Thu Feb 20 14:49:01 2014][Thread:0]szLoginHeadString之前:

<form name="login_from" action="http://PLACEHOLDER.com" method="post" accept-charset="ISO-8859-15">

[Thu Feb 20 14:49:01 2014][Thread:0]SzLoginHadstring之后:

<br/><br/> name="login_from" action="http://http://PLACEHOLDER.com" method="post" accept-charset="ISO-8859-15">


name=“login\u from”操作=”http://http://PLACEHOLDER.com“method=“post”accept charset=“ISO-8859-15”>
我期待着像这样的事情

<br/><form name="login_from".....


您的代码调用未定义的行为。如手册页所述,
sprintf
系列函数的参数不能在内存中重叠:


C99和POSIX.1-2001规定,如果调用sprintf()、snprintf()、vsprintf()或vsnprintf()会导致在重叠的对象之间进行复制(例如,如果目标字符串数组和提供的一个输入参数引用同一缓冲区),则结果是未定义的。

您的代码调用未定义的行为。如手册页所述,
sprintf
系列函数的参数不能在内存中重叠:


C99和POSIX.1-2001规定,如果调用sprintf()、snprintf()、vsprintf()或vsnprintf()会导致在重叠的对象之间进行复制(例如,如果目标字符串数组和提供的一个输入参数引用同一个缓冲区),则结果是未定义的。

它可能与您的C库有关,但通常sprintf是在内存中运行的,在编辑之前不会复制字符串,所以在开始时,它会用“
”覆盖字符串的开头,然后将您的字符串(已经覆盖)添加到自身中。所以你有两个“s”和“no”


不要同时使用一个字符串作为源和输出。

它可能与您的C库相关,但通常sprintf使用内存操作,在编辑之前不复制字符串,因此在开始时,它会覆盖字符串开头的“
”,然后将您的字符串(已覆盖)添加到自身中。所以你有两个“s”和“no”


不要同时使用一个字符串作为源和输出。
sprintf
非常不安全。首选
snprintf
。debuglogmessage已经使用了半年,而且从来没有遇到过麻烦(也是jsut将内容打印到文件)。SzLoginHadstring处于当前测试模式
char SzLoginHadstring[4096]
sprintf
非常不安全。首选
snprintf
。debuglogmessage已经使用了半年,而且从来没有遇到过麻烦(也是jsut将内容打印到文件)。SzLoginHadstring处于当前测试模式
char SzLoginHadstring[4096]
如果您引用手册页,这个答案本身会更好一些。哪些手册页?我已经想到了类似的东西,但在ISO IEC 9899或freeBSD项目手册页fprintf系列中找不到。@Filipe Gonçalves只是错拍了。在这里找不到。@Zaibis我想说手册页不完整。参见POSIX文档了解
sprintf
:很好。谢谢。如果你引用了手册页,这个答案本身会更好一些。哪些手册页?我已经想到了类似的东西,但在ISO IEC 9899或freeBSD项目手册页fprintf系列中找不到。@Filipe Gonçalves只是错拍了。在这里找不到。@Zaibis我想说手册页不完整。参见POSIX文档了解
sprintf
:很好。谢谢