getchar与putchar用法及缓冲区详解

一. getchar和putchar库函数的用法


1.1getchar库函数的用法

getchar 库函数的定义:int getchar (void)

  • 使用getchar库函数的前提是引用#include 头文件
  • getchar函数是输入字符函数(终端输入),每一次执行只读取一个字符。若输入多个字符时:例:1234,就只会读取一个字符‘1’,下一次调用,则读取字符’2’,依次往后。
  • getchar函数的返回值类型是int类型,当getchar函数接收到一个字符时,它会把它转换成对应的ASCll码值,再返回。
  • 当getchar函数读取字符失败或者结束时,会返回EOF(即为-1)。
  • getchar函数会读取回车符’\n’的

1.2putchar库函数的用法

putchar 库函数的定义:int putchar (int character)

  • 使用putchar库函数的前提是引用#include 头文件
  • putchar函数接收的是介于0~127之间的十进制整型数的ASCll码值。
  • putchar函数会把接收到字符的ASCll码值输出为对应的字符。
  • 当putchar输出字符失败或者结束时,会返回EOF(即为-1)。

1.3getchar和putchar库函数的代码实例

为了让友友萌更好的理解他们的用法,我们可以实际操作一下
实例1

#include 
int main()
{
	int ch = getchar(); //输入字符‘A’
	putchar(ch);        //打印字符‘A’
	return 0;
}

程序运行时输入:A
输出结果:A

A         
A 
按任意键关闭此窗口. . .     

实例2(多组输入+循环的实例,很好的运用了getchar返回值的特性)

//实例2(多组输入+循环)
#include 
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)   //多组输入
	{
		putchar(ch);    //输出字符
	}
	return 0;
}

程序运行时输入:abc1
输出结果:abc1 _

abc1
abc1
_    //注意getchar也是会把换行符读进去的,所以光标在下面一行

按任意键关闭此窗口. . .     

实例2要注意的是,当输入abc1\n时,函数是一个一个从终端(键盘)上读取的(其实是从缓冲区上读取的),读一个打印一个,并且还会把’\n’回车符打印出来,所以结果如上面所示的光标在下面一行。

二. scanf和getchar函数的缓冲区


2.1关于缓冲区代码的错误实现

先看如下输入密码和确认密码功能的实现的代码

#include 
int main()
{
	char a =0;
	printf("请输入密码:--->");
	scanf("%d", &a);           
	printf("请确认密码:--->");
	int ch = getchar();
	if (ch == 'Y')
		printf("确认成功\n");
	else
		printf("确认失败\n");
	return 0;
}

想问问大家,这种代码能到达我们想要的效果吗?当然不能。
程序运行时输入:Y
输出结果:

请输入密码:--->Y
请确认密码:--->确认失败

按任意键关闭此窗口. . . 

2.2关于缓冲区代码的正确实现

为什么会不让我确认密码,就直接输出确认失败并且结束程序了呢?不慌,小超会详细的讲解,没听懂你打我hhh。


1. 首先我们要了解缓冲区的概念,即当我们在键盘上输入数据后,系统会帮我们把数据先存储到缓冲区中,然后再通过getchar和scanf函数取走。当我们调用scanf和getchar时,系统会帮我们看缓冲区里有没有数据,如果有,,就会直接读取,不用再等待终端输入了

2. 其次对照上述实例中scanf相关代码

	char password[20]={0};
	printf("请输入密码:--->");
	scanf("%d", &password);

当我们输入abc1\n时,系统会先把字符串存储到缓冲区,然后scanf函数才会读取缓冲区中\n之前的字符串
注意:这时候缓冲区里面还存储着一个回车符:\n呢。过程详情如下图所示:

getchar与putchar用法及缓冲区详解_第1张图片

3. 最后对照上述代码中getchar相关代码

    printf("请确认密码:--->");
    int ch = getchar();

当我们调用getchar函数时,系统会帮我们看缓冲区里有没有数据,这是缓冲区里有一个字符’\n’,则会直接读取这个字符,即ch = '\n’,所以直接确认失败。过程详情如下图所示:

getchar与putchar用法及缓冲区详解_第2张图片
4.根据上述的缓冲区的原理,应该如何更改我们的代码,来实现我们想要的功能呢?小超粉萌肯定想到了,只要在执行getchar函数之前把缓冲区里的数据清空(即全部拿出来),getchar函数就可以正常读入了

#include 
int main()
{
	char a = 0;
	printf("请输入密码:--->");
	scanf("%d", &a);
	while (getchar() != EOF)    //清空缓冲区里的所有数据!!!
	{
		;
	}
	printf("请确认密码:--->");
	int ch = getchar();
	if (ch == 'Y')
		printf("确认成功\n");
	else
		printf("确认失败\n");
	return 0;
}

三. 总结

总的来说,对于初学者而言,getchar和putchar字符函数的用法是难以理解的,特别是其中它们的接收值返回值。而且在运用getchar输入字符函数时,一定要谨慎缓冲区的存在,在必要的情况下要清空缓冲区。本文包含了所有相关要点,希望可以帮到你们,若还有什么疑惑,欢迎私信或者评论喔。

你可能感兴趣的:(C语言,算法,c语言)