1. fflush()失效问题:fflush(stdin)是未定义行为,该函数用于输出流,即fflush(stdout) 。 用rewind(stdin)代替刷新输入缓冲区。
2. 参考文章:https://blog.csdn.net/qq_40843865/article/details/81072212
3.关于C++的清空缓冲区的方法:https://www.cnblogs.com/youngforever/articles/3125860.html
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
// 测试 2
int main()
{
char ch1;
char ch2;
char c;
while (1)
{
ch1=_getch(); //无回显,控制台
//scanf("%c", &ch1);
//ch1 = getchar();
//rewind(stdin); // 刷新输入缓冲区
//setbuf(stdin, NULL); // 关闭输入缓冲区
//scanf("%*[^\n]"); scanf("%*c");
while ((c = getchar()) != '\n' && c != EOF);
//FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
printf("ch1 = %d , ch1 = %c\n", ch1, ch1);
ch2 = _getch(); //无回显
//scanf("%c", &ch2);
//ch2 = getchar();
//rewind(stdin);
//setbuf(stdin, NULL);
//scanf("%*[^\n]"); scanf("%*c");
while ((c = getchar()) != '\n' && c != EOF);
//FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
printf("ch2 = %d , ch2 = %c\n", ch2, ch2);
}
return 0;
}
#if 0
// 测试1
int main(void)
{
char a;
int n = 0; //n代表scanf每次接收多少个。
while (1)
{
n = scanf("%c%*c", &a);
printf("%d %c", a,a);
printf("\t\t-------------------%d\n\n", n);
}
return 0;
}
#endif
// 注:fflush() 函数用于输出流。fflush(stdin)是未定义行为。
/* 以下是一些过滤回车的方法。打✔的可以每次输入多个(在新输入时,清楚缓冲区的所有内容),
没有✔的只消除\n字符(每次输入至多输入一个)。 */
//scanf --过滤回车
// 1.scanf("空格%c",&c); 添加空格、\t、\n等
// 2.scanf("%c%*c", &a); 使用 %*c 过滤
// 3.scanf("%c",&c); getchar(); 使用getchar()读取回车
// 4.setbuf(stdin, NULL); 设置缓冲区为0
// 5.scanf("%*[^\n]"); scanf("%*c"); 扫描整行,清空全部缓冲区 ✔
// 6.使用rewind(stdin); 清空全部 ✔
// 7.while ((c = getchar()) != '\n' && c != EOF); 需要临时变量c ✔
//getchar --过滤回车
// 1.a = getchar(); getchar(); 使用getchar()读取回车
// 2.setbuf(stdin, NULL); 设置缓冲区为0
// 3.scanf("%*[^\n]"); scanf("%*c"); ✔
// 4.使用rewind(stdin); ✔
// 5.while ((c = getchar()) != '\n' && c != EOF); 需要临时变量c ✔
/// C++
// 1.
// cin.clear();
// cin.sync();
// 2.
//cin.ignore( numeric_limits<streamsize>::max(), '\n' );
// cin.ignore(1024, '\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,
//所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。
// 3.对于 _getch() 无回显有效
//控制台清空缓冲区 FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));