sprintf_s的作用是什么?它和sprintf(newpath, "%s%s",...)有何区别?

9
我正在使用 sprintf(newpath,“%s%s”,cCurrentPath,“\\ init.scm”) 将 \init.scm 添加到当前目录路径中,但是通常会出现警告:

警告 C4996:'sprintf':此函数或变量可能不安全。 请考虑改用 sprintf_s。 要禁用过时警告,请使用 _CRT_SECURE_NO_WARNINGS。

sprintf_s 不支持这样的 "%s%s" 字符串相加。 我该如何使用 sprintf_s 实现它?


"Sprintf_s不支持这种"%s%s"字符串相加?你确定吗?(顺便说一句,当你谈论字符串时,通常称为连接,而不是“相加”。)" - Mat
是的,它显示警告C4024:“sprintf_s”:第2个形式参数和实际参数类型不同,并在运行时失败。 - cnd
我不这么认为,因为sprintf工作得很好。 - cnd
你在 "\init.scm" 中也缺少一个反斜杠 - 你需要用 \\ 来表示一个反斜杠。 - ugoren
但是 sprintf 函数可以在没有第二个参数(size)的情况下使用。 - cnd
显示剩余2条评论
1个回答

17

sprintf_s基本上与sprintf相同,但它会多获取一个参数:

sprintf_s(newpath, sizeof(newpath), "%s%s", cCurrentPath, "\\init.scm");

注意 - 如果newpath是一个普通的字符数组,sizeof(newpath)可以使用。如果它是一个指针或作为参数传递的数组,则可能需要另一种方法来获取大小。
在非 MS 环境中,您还可以使用snprintf达到相同的目的(尽管工作方式不同)。


但是%s%s是两个字符串的总和,将要进入新路径。如何实现? - cnd
_s函数是为了安全而设计的,因此您不会尝试覆盖未分配的内存。因此,第二个参数必须是第一个参数已分配内存的大小。这与后续参数无关,它只是确保如果实际文本比预期长度更长,就不会发生内存访问冲突。 - Philipp Wendt
抱歉,我忘记了格式字符串。现在已经修复了,你可以按照我写的方式使用它。 - ugoren
可能希望使用__countof(newpath)来避免将来出现错误(例如在转换代码以使用swprintf_s时)。或者,如果使用C ++,只需使用sprintf_s(newpath,“%s%s”,cCurrentPath,“\\ init.scm”);(假设缓冲区是本地的)。 - user1067737

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接