C getchar & putchar函数

目录

前言

1.getchar()函数

2.putchar()函数

3.清空缓冲区

3.1   缓冲区

3.2   场景

3.3   问题分析 

3.4   改进(即清空缓冲区)


前言

C语言的字符输入函数getchar和输出函数putchar功能介绍,以及缓冲区的简单认识。

1.getchar()函数

1.int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数(返回字符的ASCII码值)。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。

2.读取失败or遇到文件末尾是返回EOF。

ch = getchar() 和 scanf("%c", &ch); 语句效果相同

2.putchar()函数

1.int putchar(int c) 函数把字符(或者你想返回字符对应的ASCII码值)输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

putchar(ch) 和 printf("%c", ch); 语句效果相同

3.清空缓冲区

3.1   缓冲区

1.什么是缓冲区?

用户输入的字符被收集并储存在一个被称为缓冲区的临时存储区,按下Enter键后,程序才可以使用用户输入的字符。

2.为什么要有缓冲区?

首先,把若干字符作为一个块进行传输比逐个发送这些字符节约时间;

其次,如果用户打错字符,可以直接通过键盘修正错误,当最后按下Enter键时,传输的是正确的输入。

3.2   场景

#include

int main()
{
	char password[20];
	printf("请输入密码->");
	scanf("%s", password); //数组名不需要使用取地址符&
	printf("请确认Y/N:");
	int ch = getchar();
	if ('Y' == ch) {
		printf("确认成功\n");
	}
	else {
		printf("确认失败\n");
	}
	return 0;
}

输出结果:

3.3   问题分析 

1.从输出结果我们可以看出:在我们输入密码之后,我们并未选择确认,程序就直接认定我们确认失败。

2.问题原因:scanf 与 getchar 都是从缓冲区中获取内容,但是关键来了:scanf函数在我们输入完毕后按下Enter键(或者是空格)后方才停止输入,此时scanf中的password拿走了密码123456,但是后面你敲的回车键转变成字符 ' \n ' ch = getchar()拿走,也就是说ch = ' \n '肯定不等于' Y ',所以直接输出确认失败

3.4   改进(即清空缓冲区)

1.由3.3分析可知,密码确认的失败主要是因为getchar读取的  ' \n ' 导致,因此,我们需要清空缓冲区,即scanf读取后缓冲区剩余字符我们需要清空。

#include

int main()
{
	char password[20];
	printf("请输入密码->");
	scanf("%s", password); //数组名不需要使用取地址符&
	getchar();      //这里我又加了一个getchar(),这样\n就被去掉了
	printf("请确认Y/N:");
	int ch = getchar();
	if ('Y' == ch) {
		printf("确认成功\n");
	}
	else {
		printf("确认失败\n");
	}
	return 0;
}

2.缓冲区字符较多,如何清空?

①还是上面的代码,比如输入123456  abcd,在6后面我输入了一个空格,此时scanf只读取到6,则缓冲区还剩下abcd\n五个字符,但是getchar()一次只能去除一个,则我们需要通过循环的方式,逐步去除缓冲区中所有的剩余字符。

②代码演示:

#include

int main()
{
	char password[20];
	printf("请输入密码->");
	scanf("%s", password); //数组名不需要使用取地址符&
	int ch = 0;
	while (ch = getchar() != '\n') {
		;
	}
	printf("请确认Y/N:");
	ch = getchar();
	if ('Y' == ch) {
		printf("确认成功\n");
	}
	else {
		printf("确认失败\n");
	}
	return 0;
}

运行结果:

C getchar & putchar函数_第1张图片

这样我们就达到了一个清空缓冲区的效果! 

你可能感兴趣的:(从零开始的C语言生活,c语言,开发语言)