You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:11:34