Visual C++控制台程序while循环后scanf失效问题求助
解决计算器循环中scanf失效的问题
嘿,我来帮你搞定这个困扰你的问题!你遇到的scanf失效本质是输入缓冲区残留的换行符在搞鬼,再加上代码里的几个小错误,导致程序跳过了你的输入。咱们一步步来分析和修复:
问题根源拆解
- 变量类型不匹配:你用
char v;来存储重复选择的整数输入(1或0),scanf_s("%d", &v);会导致内存越界,而且这个操作后,输入时的换行符会留在缓冲区里。 - fflush(stdin)不可靠:C标准里
fflush只对输出流有效,虽然部分Windows编译器支持它刷新输入流,但这是未定义行为,不能保证每次都生效。 - 未处理空白字符:
scanf("%c")会读取缓冲区里的任何字符,包括换行符,当你上次输入完按下回车,这个换行符就会被下次的scanf("%c")直接读取,导致程序跳过你的手动输入。
修复方案
1. 修正变量类型
把存储重复选择的变量改成int类型,避免类型不匹配的问题,比如新增一个int repeat;变量,不要复用char v;。
2. 正确处理输入缓冲区
有两种可靠的方式跳过残留的空白字符:
- 方式一:在
scanf("%c")前面加空格,scanf(" %c", &v);,空格会自动跳过所有空白字符(包括换行、空格、制表符)。 - 方式二:用循环手动清空缓冲区,直到读取到换行符:
int c; while ((c = getchar()) != '\n' && c != EOF);
3. 完整修改后的代码
#include "pch.h" #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <Windows.h> int main() { // 建议用int main()而非void main(),符合C标准 char v; int repeat = 1; // 用int类型存储重复选择 while (repeat == 1) { v = 0; printf("Type (+,-,*,/): "); // 方式一:用带空格的scanf跳过空白字符 scanf(" %c", &v); printf("Type you chose: %c", v); Sleep(2000); switch (v) { case '+': printf("\nTBD +"); break; case '-': printf("\nTBD -"); break; case '*': printf("\nTBD *"); break; case '/': printf("\nTBD /"); break; default: printf("\nPlease only use '+,-,*,/' above"); break; } printf("\nDo you want to repeat (1==yes|0==no): "); scanf_s("%d", &repeat); // 方式二:手动清空缓冲区,避免下次读字符时读到换行 int c; while ((c = getchar()) != '\n' && c != EOF); } return 0; // int main()需要返回值 }
关键修改说明
- 把
void main()改成int main()并返回0,符合C语言标准规范。 - 用
int repeat存储重复选择,避免类型不匹配。 scanf(" %c", &v)里的空格会自动跳过之前残留的换行符,确保读取到你手动输入的运算符。- 在读取repeat之后,用循环清空缓冲区,防止下次循环时残留的换行符干扰输入。
这样修改后,程序就能按照你期望的方式重复运行,每次都能正常接收你的输入啦!
内容的提问来源于stack exchange,提问作者Jakob
相关产品推荐
相关产品推荐

