关于字符读取,过滤回车的问题。

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

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