關於字符讀取,過濾回車的問題。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章