首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sprintf_s崩溃

sprintf_s崩溃
EN

Stack Overflow用户
提问于 2011-05-05 03:35:43
回答 4查看 2.2K关注 0票数 1

在sprintf_s执行以下代码时,我遇到了崩溃。这段代码工作了很多年,没有任何问题。当我在下面的语句中给出strcat_s和sprintf_s的大小时,崩溃并没有出现。这是什么原因?

strcat_s(sztmpCurrDate,100,sztmpCurrTime),sprintf_s(sztmpCurrDate,100,%s:%0.3d,sztmpCurrDate,curTime.wMilliseconds);

代码语言:javascript
运行
复制
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);
EN

回答 4

Stack Overflow用户

发布于 2011-05-05 04:02:54

来自sprintf_s

如果在重叠的字符串之间发生复制,则行为未定义。

你的代码:

代码语言:javascript
运行
复制
sprintf_s(sztmpCurrDate,"%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);

从源复制到目标sztmpCurrDate。另外,您还没有指定目标字符串的大小,这是sprintf_s所需要的(我不知道您的代码是如何编译成这样的)。尝试:

代码语言:javascript
运行
复制
sprintf_s(sztmpCurrDate + strlen(sztmpCurrDate), 100-strlen(sztmpCurrDate),
          ":%0.3d",curTime.wMilliseconds);

更好的方法,因为您使用的是C++,是使用std::string,然后您将不必担心这种C字符串操作错误。

票数 4
EN

Stack Overflow用户

发布于 2016-05-10 15:24:20

语法错误!

sprintf_s的第二个参数是缓冲区的长度,在您的情况下,当程序崩溃时,提供了指向C字符串(char *)的指针。这绝对是语法错误。

编译器可能会发出警告,但遗憾的是,这已经被忽略了。这是因为sprintf_s接受三个参数+变量的参数数。在错误的情况下,您提供了三个参数,因此编译器感到满意,但他将您的“格式字符串”视为“参数数”,而sztmpCurrDate则将其视为“格式字符串”。

如果您使用具有固定数量的参数的任何其他函数,并且所提供的参数少于需要,这将是编译错误。

票数 1
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5892376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档