Visual Studio运行含scanf的C程序出现多类报错问题求解
问题原因及修复方案
各报错/警告逐一说明
1. Return value ignored: 'scanf'
原因:scanf 函数的返回值代表成功读取并赋值的变量数量,Visual Studio的静态检查会提示你未处理该返回值——如果用户输入非法内容(比如输入字母而非数字),scanf 会返回0或EOF,未处理的话后续逻辑会用到异常值引发错误。
修复方案:
- 方案1(推荐):增加返回值判断,处理输入失败的情况
- 方案2(仅用于简单测试程序):将返回值强转为
void消除警告,示例:(void)scanf("%lf", &NET_Income);
2. Warning C4477 'scanf' : format string '%f' requires an argument of type 'float *', but variadic argument 1 has type 'double *'
原因:scanf 的格式符规则中,%f 仅对应 float* 类型的指针参数,你定义的 NET_Income 是 double 类型,对应的指针参数需要用 %lf 格式符匹配。
修复方案:将所有 scanf 语句中的 "%f" 修改为 "%lf"。
3. Warning C4013 'OR' undefined; assuming extern returning int
原因:C语言的逻辑或运算符是双竖线 ||,不存在大写的 OR 关键字,编译器会把 OR 识别为未定义的函数名,因此抛出该警告。同时你原有代码还存在两处额外语法错误:
while的判断条件没有完全包裹在括号内,两个判断条件需要放在同一对小括号里while条件末尾多写了分号,会导致循环体为空,后续大括号内的代码不会被循环执行
修复方案:- 将
OR替换为|| - 把两个判断条件都放到
while后的小括号内 - 删除
while条件末尾的分号
修复后完整代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { double NET_Income = 9999.58; printf("Enter your NET monthly income: "); // 合并输入判断逻辑,同时处理输入非法和数值范围错误 while (scanf("%lf", &NET_Income) != 1 || NET_Income < 500.00 || NET_Income > 400000.00) { // 清空输入缓冲区,避免非法输入残留导致死循环 while(getchar() != '\n'); printf("Sorry, that is an incorrect amount, please re-enter your NET monthly income: "); } return 0; }
内容的提问来源于stack exchange,提问作者ChecksOverStripes
相关产品推荐
相关产品推荐

