C语言使用scanf()获取用户输入时报“拒绝访问”错误(MinGW已配置PATH)
先理清核心逻辑:能正常跑Hello World,说明你MinGW的编译链路、标准输出权限完全没问题。报access denied是因为scanf在申请控制台输入读取权限时被拦截了,按下面的步骤挨个排查就行,基本能覆盖99%的同类场景:
第一步:先确认是IDE拦截还是系统层面拦截
绝大多数同类报错,都是因为你用的代码编辑器/IDE(VS Code、Dev-C++、各类轻量编译插件的内置运行器)没拿到控制台的stdin访问权限,尤其是Windows Defender、第三方杀毒软件的“受控文件夹访问”功能,会主动拦截非系统原生终端启动的、尝试读取控制台输入的进程。
验证方式:完全关掉IDE,打开系统自带的cmd,切到你代码所在的文件夹,手动执行编译+运行命令:gcc your_test_code.c -o test.exe ./test.exe如果这一步能正常输入数字、输出计算结果,说明问题全在IDE的运行配置上:
- 关掉IDE内置的“弹出内置控制台运行程序”选项,改成用系统外置终端启动程序
- 把存代码的文件夹、编译生成的exe路径,加到杀毒软件、Windows安全中心的白名单里
第二步:排查PATH环境变量的路径冲突
很多人配置MinGW环境时,PATH列表里会残留其他版本C编译器的路径(比如旧版TDM-GCC、MSVC的运行时路径、Python自带的同名C运行时库路径),导致程序实际加载了非预期的动态链接库,触发系统的访问拦截。
验证方式:在cmd里执行两个命令检查配置:where gcc gcc -v确认返回的gcc路径全部指向你安装的MinGW的bin目录,输出版本和你实际装的MinGW版本一致。如果有其他路径排在MinGW路径前面,就把MinGW的bin目录挪到PATH列表的最顶端,注意改完环境变量必须把所有终端、IDE全重启,配置才会生效。
第三步:排查MinGW版本兼容问题
部分2019年之前出的老旧32位版本MinGW,在Windows 10 1909之后的系统上,会因为控制台编码兼容问题,调用scanf时触发系统的权限拦截。这种情况直接替换成最新的64位版本MinGW,重新配PATH路径就能解决。
快速验证方法:把代码里的scanf("%d", &num)临时换成getchar(),如果测试同样报access denied,说明问题和scanf的语法逻辑没关系,就是运行时环境的配置问题。
内容的提问来源于stack exchange,提问作者Ranuja Perera

