为何Visual Studio的scanf_s()无法接收字符串输入?
为什么在Visual Studio 2022中使用scanf_s()接收字符串会报错?
核心原因是scanf_s与scanf的参数要求完全不同——scanf_s作为微软扩展的安全输入函数,处理字符串时必须额外传入缓冲区大小参数,否则会触发参数不匹配的编译错误(C4473、C6064)。
错误代码的问题所在
你写的scanf_s("%s", name)缺少了关键的缓冲区长度参数。scanf_s在解析%s格式符时,要求必须明确告知函数缓冲区的最大容量,以此避免缓冲区溢出的安全风险,而原代码没有提供这个参数,所以编译器直接报错。
修正后的正确代码
#include<stdio.h> #include<stdlib.h> void main() { char name[25]; printf("Enter your name "); // 第三个参数传入缓冲区的元素个数,限制输入长度 scanf_s("%s", name, (unsigned)_countof(name)); printf("Hello %s!", name); }
这里_countof(name)是Visual Studio提供的宏,能自动计算数组的元素个数(这里就是25),也可以直接写常量25,但用宏更灵活,数组长度修改时无需手动调整参数。
补充说明
scanf之所以能正常运行,是因为它不需要缓冲区大小参数,但这也带来了安全隐患:如果输入的字符串长度超过缓冲区(比如输入超过24个字符的名字),会直接导致缓冲区溢出,破坏程序内存,这也是Visual Studio标记scanf为不安全并禁用它的原因。
内容的提问来源于stack exchange,提问作者Munol
相关产品推荐
相关产品推荐

