You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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提示

该问题由两个低级错误共同导致:

  1. 输出逻辑写错:case 'e'分支中你误用了输入函数scanf("Bye Bye"),应该改为输出函数printf("Bye Bye\n")
  2. 循环条件逻辑错误:原条件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,提问作者יונתן אליהו

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:45:03