C语言scanf_s读取字符串报错,定义_CRT_SECURE_NO_WARNINGS仍无效
问题根因定位
1. scanf_s传参不符合规范
scanf_s为微软推出的安全增强版输入函数,针对%s、%c、%[]这类涉及字符缓冲区的格式说明符,强制要求每个缓冲区指针参数后额外传入该缓冲区的大小参数,用于边界校验避免溢出。
你当前代码的写法:
scanf_s("%79s%79s", string1, string2);
仅传入了两个字符数组的指针,缺少两个对应的缓冲区长度参数,参数数量不匹配直接触发报错。
正确写法应为:
scanf_s("%79s%79s", string1, SIZE, string2, SIZE);
每个字符串指针后跟上对应缓冲区的大小即可。
2. _CRT_SECURE_NO_WARNINGS宏作用不匹配
该宏的作用是禁用编译器对scanf、strcpy、strcat等传统C标准库非安全函数的告警提示,完全不涉及scanf_s本身的参数校验逻辑,因此添加该宏无法解决scanf_s的传参错误。
如果不想处理scanf_s的额外参数要求,可直接改用传统scanf函数,此时需要注意:#define _CRT_SECURE_NO_WARNINGS必须放在所有标准库头文件引入的最前面,否则宏不会生效。
3. 测试输入与代码逻辑不匹配
你提供的测试输入仅为1个字符串helloworld,但代码中scanf_s设置了两个%s格式符,会持续等待第二个输入传入导致程序卡住,需要输入两个用空格分隔的字符串才能正常运行。
内容的提问来源于stack exchange,提问作者Hwang Soohyeon
相关产品推荐
相关产品推荐

