C语言中,当我们使用输入函数(如scanf、fgets等)读取用户输入时,输入的数据通常会先被存放在一个缓冲区中。如果在后续的输入操作中,缓冲区中还残留着上一次输入的数据,就会导致程序的输入结果不符合预期。因此,在某些情况下,我们需要手动清空输入缓冲区。

1、使用 fflush(stdin)(不推荐)

虽然 fflush 通常用于刷新输出流,但有些编译器可以 fflush(stdin) 清空输入缓冲区。然而,这种做法并不是 C 标准的一部分,因此它并不是移植性强的解决方案。

#include <stdio.h>

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    
    // 清空输入缓冲区
    fflush(stdin);  // 不推荐使用
    
    printf("输入的数字是:%d\n", num);
    return 0;
}

2、 使用 getchar() 或 while 循环清空缓冲区

更常见且标准的方法是使用 getchar() 来读取并丢弃缓冲区中的所有字符,直到遇到换行符或文件结束标志(EOF)。这样可以确保清空缓冲区中多余的字符。

#include <stdio.h>

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    
    // 清空缓冲区
    while (getchar() != '\n');  // 丢弃直到换行符为止
    
    printf("输入的数字是:%d\n", num);
    return 0;
}

3、使用 scanf 忽略换行符

如只需要在每次输入后清除换行符,也可以使用 scanf 的格式控制来直接跳过换行符。

#include <stdio.h>

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    
    // 使用 scanf 跳过换行符
    scanf("%*c");  // 忽略一个字符(通常是换行符)
    
    printf("输入的数字是:%d\n", num);
    return 0;
}

4、 使用 fgets() 读取一整行

fgets() 函数可以用来读取一整行输入,包含换行符 \n,并且它会阻塞直到输入完成。这种方法可以有效地清空缓冲区,特别是在输入数据后需要丢弃剩余数据时。

#include <stdio.h>

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    
    // 使用 fgets 清空缓冲区
    char ch;
    while ((ch = getchar()) != '\n' && ch != EOF);  // 读取并丢弃直到换行符
    
    printf("输入的数字是:%d\n", num);
    return 0;
}

5、 setbuf() 或 setvbuf() 设置缓冲区

setbuf()setvbuf() 用于控制文件流的缓冲方式,但它们通常并不是用来清空标准输入缓冲区的。不过在一些特殊场景下,这些函数可以帮助减少不必要的缓冲,进而减少输入问题。

#include <stdio.h>

int main() {
    int num;
    setbuf(stdin, NULL);  // 禁用标准输入流的缓冲(直接从终端读取输入)

    printf("请输入一个整数:");
    scanf("%d", &num);

    printf("输入的数字是:%d\n", num);
    return 0;
}

推荐文档