在sprintf_s执行以下代码时,我遇到了崩溃。这段代码工作了很多年,没有任何问题。当我在下面的语句中给出strcat_s和sprintf_s的大小时,崩溃并没有出现。这是什么原因?
strcat_s(sztmpCurrDate,100,sztmpCurrTime),sprintf_s(sztmpCurrDate,100,%s:%0.3d,sztmpCurrDate,curTime.wMilliseconds);
char sztmpCurrDate[100] = "";
char sztmpCurrTime[100] = "";
SYSTEMTIME curTime;
GetLocalTime(&curTime);
GetLocalTime(&curTime);
GetDateFormat(LOCALE_USER_DEFAULT,
DATE_SHORTDATE,
&curTime,
NULL,
sztmpCurrDate,
100);
GetTimeFormat(LOCALE_USER_DEFAULT,
TIME_FORCE24HOURFORMAT,
&curTime,
"HH':'mm':'ss",
sztmpCurrTime,
100);
strcat_s(sztmpCurrDate," ");
strcat_s(sztmpCurrDate,sztmpCurrTime);
sprintf_s(sztmpCurrDate,"%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);
发布于 2011-05-05 04:02:54
如果在重叠的字符串之间发生复制,则行为未定义。
你的代码:
sprintf_s(sztmpCurrDate,"%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);
从源复制到目标sztmpCurrDate
。另外,您还没有指定目标字符串的大小,这是sprintf_s
所需要的(我不知道您的代码是如何编译成这样的)。尝试:
sprintf_s(sztmpCurrDate + strlen(sztmpCurrDate), 100-strlen(sztmpCurrDate),
":%0.3d",curTime.wMilliseconds);
更好的方法,因为您使用的是C++,是使用std::string
,然后您将不必担心这种C字符串操作错误。
发布于 2016-05-10 15:24:20
语法错误!
sprintf_s的第二个参数是缓冲区的长度,在您的情况下,当程序崩溃时,提供了指向C字符串(char *)的指针。这绝对是语法错误。
编译器可能会发出警告,但遗憾的是,这已经被忽略了。这是因为sprintf_s接受三个参数+变量的参数数。在错误的情况下,您提供了三个参数,因此编译器感到满意,但他将您的“格式字符串”视为“参数数”,而sztmpCurrDate则将其视为“格式字符串”。
如果您使用具有固定数量的参数的任何其他函数,并且所提供的参数少于需要,这将是编译错误。
发布于 2011-05-05 04:04:48
您可能使用了错误的版本:
sprintf_s(sztmpCurrDate,"%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);
相反,它应该是:
int slen = strlen(sztmpCurrDate) + 1;
sprintf_s(sztmpCurrDate, slen, "%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);
有关更多信息,请参阅此S。
https://stackoverflow.com/questions/5892376
复制相似问题