getchar()函数解释与理解

一、什么是getchar()函数

.getchar()----读取单个字符的函数..

.如果想要读取多个字符用到 gets()函数

int  getchar (void)

getchar()函数的返回类型为  int整型 参数为 void.

1、getchar其实返回的是字符的ASCII码值(整数)。
2、getchar在读取结束或者失败的时候,会返回EOF。(EOF意思是end of file,本质上是-1).

1.连续连续单个字符串


#include <stdio.h>
#include <string.h>
int main()
{
	int ch = 0;  //因为 getchar() 返回类型为 int
	while ((ch = getchar()) != EOF) // 连续输入单个字符
	{
		printf("%c",ch);  // 输出一个字符
		//putchar(ch);    // 此时 printf("%c",ch) 与  putchar(ch)  输出结果一样
  	}
 
	return 0;
}

 解析:getchar先读取一个字符放到ch里面去,如果这个字符不等于EOF,就进入循环,打印这个字符。当getchar读到文件末尾或者结束时,它会返回一个EOF,此时结束循环。

( printf("%c",ch) 与  putchar(ch)  输出结果一样)

2.getchar()函数其他用法(错误分析)

按照我们的预想,输出一个字母,就会输出  is an alphabet.不是字母就会输出  is not an alphabet.结果 每一次输出,总是会多输出一个 is not an alphabet. 。为什么会这样呢?

(2)原因分析(原理详解)
输入函数的原理:

输入函数中包含了 scanf()函数和 getchar()函数,它们都是从键盘上来读取我们的数据,但它们不是直接从键盘上来读取我们的数据。它们和键盘之间有一个区域存放数据,叫缓冲区。输入函数先来看缓冲区中是否有数据,如果有,它直接就拿走了,不需要从键盘输入,如果缓冲区什么都没有,则需要从键盘输入,再拿走。

eg:

while ((a = getchar()) != EOF)

连续输入时,我们按回车最后会输入个\n ,第二个getcgar()发现缓冲区还有个 \n 不需要从键盘输入,直接拿走了 \n ,因此发现了问题原来每次多输出的那个 is not an alphabet. 就是 \n 导致的

注意:getchar() 函数 每次只能取走一个字符 

3.解决方法

只需要在每次输入完一个字符后先把缓冲区里的请空即可。

此时就用到getchar另一个用法 ,将缓冲区里面的 \n 清除掉。

此时加入getchar()在代码中,在每次while()循环开始加入 getchar()函数,清除每一次的 \n,成功了

4.getchar()进阶

 此时会发现我们还没有输入 Y 或者 N 确认失败自己跳出来了。

 从键盘输入密码,我们输入123456。为了让123456放进去,我们还敲了一个回车,所以缓冲区里为123456\n。接下来就是scanf来读缓冲区里的字符串了,scanf读取的方式是读取\n之前的内容,所以读取的是123456.

注意:scanf()读取的是\n之前的内容

 getchar看到缓冲区中有数据(\n),直接取走,不需要从键盘输入。自然也就出现了我们上面运行结果的那一幕:还没输入N或Y,就立马跳出“确认失败”了。

同样我们在scanf()输入完后再加入 getchar()清除掉 \n

但当我们输入密码为123456 789时(中间有一个空格),还没等我们输入N或Y,又立马跳出了“确认失败”,因为scanf来取缓冲区中的数据,当它读到空格的时候,它就不再读了(这是scanf的一个作用性质)。所以scanf就只取走了123456,而缓冲区中还剩下(空格) 789\n。

因为这里只有一个getchar,它只能读取一个字符,也就是只读了空格,缓冲区中还剩789\n

5.解决方法

我们需要把缓冲区中的东西先全部清走。
那我们就用一个循环,只要没读到\n,我们就一直用getchar读。(while(getchar() != '#'))

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	//把缓冲区中的内容全读走
	while (getchar() != '\n')
	{
		;
	}
	puts(password);  // 验证输入的字符串
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值