C语言fflush清空输入缓冲区失效及退出未打印信息问题求解
C语言代码问题修复方案
问题1:fflush(stdin) 无法清空输入缓冲区
原因
fflush(stdin) 属于C标准未定义行为,仅部分老旧编译器(如Visual C++ 6.0)对其做了自定义实现,GCC、Clang等主流编译器均不支持该用法,因此无法生效。
解决方案
自行实现跨平台的缓冲区清空函数,替代fflush(stdin)调用:
void clear_stdin() { int c; // 读取缓冲区所有字符直到换行或文件结束 while ((c = getchar()) != '\n' && c != EOF); }
在q_subMat()执行结束后调用clear_stdin()即可清空所有残留的回车、空格等字符,避免被后续输入读取。
补充:你现有代码中
printMainOption里的scanf(" %c", ch)已经在格式符前加了空格,本身会自动跳过所有前置空白字符,大部分场景下已经可以规避残留字符问题,手动清空缓冲区属于双保险。
问题2:输入'e'无法正常退出、不打印BYE BYE提示
该问题由两个低级错误共同导致:
- 输出逻辑写错:
case 'e'分支中你误用了输入函数scanf("Bye Bye"),应该改为输出函数printf("Bye Bye\n") - 循环条件逻辑错误:原条件
while(ch!='e' || ch!='E')是永真式,无论ch取什么值,两个判断必有一个成立,循环永远不会退出。且你已经在printMainOption中将输入字符转为小写,只需判断ch != 'e'即可。
修正后的完整代码
#include "exe.h" #include <time.h> #include <stdlib.h> #include <stdio.h> #include <ctype.h> // 新增tolower所需头文件 // 自定义输入缓冲区清空函数 void clear_stdin() { int c; while ((c = getchar()) != '\n' && c != EOF); } void printMainOption(char *ch); void q_subMat(); // 补充函数声明避免隐式声明警告 int main() { srand(time(NULL)); //TODO: change the options char ch; do { printMainOption(&ch); switch (ch) { case 's': q_subMat(); clear_stdin(); // 替换原fflush(stdin) break; case 'c': //funcC break; case 'b': //funcB break; case 'e': printf("Bye Bye\n"); // 替换原错误的scanf clear_stdin(); break; default: printf("The operator doesn't match any constant\n"); } } while(ch != 'e'); // 修正循环条件 return 0; } void printMainOption(char *ch) { printf("\n\nPlease choose one of the following options\n"); printf("S/s - Biggest Matrix Sum\n"); printf("C/c - Color Game\n"); printf("B/b - Black And White Game\n"); printf("E/e - Quit\n"); scanf(" %c", ch); *ch = tolower(*ch); }
内容的提问来源于stack exchange,提问作者יונתן אליהו
相关产品推荐
相关产品推荐

