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

C语言逐次输入字符异常求助:程序一次性读取多次输入

问题分析与解决

嘿,你遇到的这个问题其实是输入缓冲区残留的换行符在搞鬼!让我给你拆解一下:

当你第一次输入字符并按下回车时,getchar()只会读取你输入的那个字符,但按下的回车(也就是'\n')会留在标准输入的缓冲区里。接下来调用gets(b)的时候,gets会直接把缓冲区里剩下的'\n'读进去,根本不需要你再输入,所以看起来程序好像一次性要你输入两个字符。

另外你的代码还有两个小问题:

  • 声明char b[2];后直接调用puts(b),这时候b是未初始化的,会输出一堆垃圾值。
  • gets()是已经被C标准废弃的不安全函数,很容易造成缓冲区溢出,建议换成fgets()。

修正后的代码

#include <stdio.h>

int main(){
    printf("Enter a character \n");
    char a = 0;
    a = getchar();
    
    // 清空输入缓冲区里的剩余字符(包括回车)
    while ((getchar()) != '\n'); 
    
    printf("You entered: %c \n",a);
    putchar(a);
    printf("\n");
    
    char b[2] = {0}; // 初始化数组,避免垃圾值
    printf("Enter another character \n"); // 提示用户输入第二个字符
    fgets(b, sizeof(b), stdin); // 用fgets替代gets,更安全
    
    // 处理输入的字符(跳过可能的换行)
    if (b[0] != '\n') {
        printf("You entered: %c \n",b[0]);
        puts(b);
    }
    
    return 0;
}

关键说明

  • 清空输入缓冲区:用while ((getchar()) != '\n');循环把缓冲区里的所有字符读到换行符为止,这样后续的输入函数就不会读取到残留的回车了。
  • 替换gets为fgets:fgets()需要指定缓冲区大小,能有效避免缓冲区溢出,是更安全的选择。
  • 初始化数组:char b[2] = {0};把数组初始化为全0,避免未初始化导致的垃圾输出。

这样修改后,程序就会先等你输入第一个字符回车,然后再提示你输入第二个字符,完美实现你想要的逐次输入效果啦!

内容的提问来源于stack exchange,提问作者Eiram Araujo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:47:15