当我使用Visual Studio时,它说“ scanf不安全,请尝试使用scanf_s”。但是,如果我在gcc或其他编译器中使用scanf_s,它将无法正常工作。 scanf_s是否仅在Visual Studio上工作?如果是这样,为什么?视觉工作室网站说“ scanf不安全”。如果不安全,那为什么其他人仍然使用它呢?
答案 0 :(得分:3)
scanf_s
是特定于Microsoft的。标头为stdio.h,但不在GCC中。
使用
scanf
读取字符串时,请始终以%s
格式指定宽度(例如,用“%32s
”而不是“%s
”);否则,格式不正确的输入很容易导致缓冲区溢出。
或者,考虑使用scanf_s
,_scanf_s_l
,wscanf_s
,_wscanf_s_l
或fgets
。
在“ Why didn't gcc implement _s
functions?”中查看更多信息
pmg
在注释中添加scanf_s()
为Standard C11 (optional)。
这意味着activating c11
with gcc
可能就足够了。
但是Shawn添加:
IIRC,Microsoft版本未遵循该标准。
再者,没有其他主要的C库供应商愿意执行附件K,因此它对于所有意图和目的也可能是特定于MS的。
pmg
确认:
我的
gcc
(版本6.3.0)无法识别带有scanf_s()
的{{1}}