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));