C语言scanf每次读取6个值而非3个、EOF终止功能失效问题咨询
问题根因
你代码的两个异常都是同一错误写法导致的:
- 单次循环内连续调用了2次
scanf("%d%d%f", ...),第一次调用读3个值、没有做任何检测,第二次调用又读3个值、才做EOF判断,两次累加就需要输入6个值才会进入下一轮循环,这是第一个问题的诱因。 - EOF检测仅绑定了第二次
scanf的返回值,第一次scanf遇到EOF时没有任何处理逻辑,自然无法触发循环终止,这是第二个问题的根因。
修复方案
仅保留单次scanf调用,直接对它的返回值做判断即可:
#define SIZE 7 #include<stdio.h> int main() { int NoOfDoors[SIZE]; int CarManufYear[SIZE]; float CarCost[SIZE]; for(int i=0; i<SIZE; i++) { printf("\nEnter 3 values (Door, year, price):"); // 单次调用scanf,直接判断返回值 int ret = scanf("%d%d%f", &NoOfDoors[i], &CarManufYear[i], &CarCost[i]); if(ret == EOF) { break; } // 可选扩展:增加输入合法性判断,如果读入参数不足3个说明格式错误 if(ret != 3) { printf("输入格式错误,请重新输入\n"); // 清空输入缓冲区避免死循环 while(getchar() != '\n'); i--; // 回退下标,当前轮次重新输入 } } printf("End of the code"); return 0; }
补充说明
scanf的返回值有两类情况:
- 正常输入时返回成功读取的参数个数,符合需求时该值为3
- 遇到EOF(Windows下按Ctrl+Z、Linux/macOS下按Ctrl+D)时返回
EOF宏(值为-1)
内容的提问来源于stack exchange,提问作者Haspacejar
相关产品推荐
相关产品推荐

