sprintf的输出奇怪,是什么造成的呢?

时间:2014-02-20 15:21:56

标签: c printf

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

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

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

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

我不理解结果字符串。

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

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

[Thu Feb 20 14:49:01 2014] [线程:0] szLoginHeadString之后:

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

我会期待像

这样的东西
<br/><form name="login_from".....

我没想到什么?

2 个答案:

答案 0 :(得分:4)

您的代码调用未定义的行为。 sprintf族函数不能被赋予在内存中重叠的参数,如联机帮助页中所述:

如果调用sprintf(),snprintf(),vsprintf()或vsnprintf()会导致在重叠的对象之间进行复制,则

C99和POSIX.1-2001指定结果未定义(例如,如果目标字符串数组和提供的输入参数之一引用相同的缓冲区。)

答案 1 :(得分:1)

它可能与您的C库相关,但是通常sprintf在您的内存中运行,而不是在编辑之前复制字符串,因此在开始时它会覆盖您的字符串的开头“WB”,然后添加您的字符串(已经淹没了自己。所以你有两个和没有。

请勿同时使用一个字符串作为来源和输出。