对于getchar( )函数的理解

一、getchar()函数的返回类型与机制 

对于getchar( )函数的理解_第1张图片对于getchar( )函数的理解_第2张图片库函数查找的链接:cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/  

 此时大家肯定会想,getchar()函数不是用来输入单个字符的吗,为什么返回类型为 int 整型呢 ?

原因如下: 

1、getchar其实返回的是字符的ASCII码值(整数)。
2、getchar在读取结束或者失败的时候,会返回EOF。

(注意:EOF意思是end of file,本质上是-1.)

二、连续单个字符串 (代码演示)

#include 
#include 
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)  输出结果一样 

三、getchar()函数实战演练 

例题:

判断是不是字母_牛客题霸_牛客网

#include
int main()
{
    char a;
    while ((a = getchar()) != EOF)
    {
        if ((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
            printf("%c is an alphabet.\n", a);
        else
            printf("%c is not an alphabet.\n", a);
    }
    return 0;
}

(1)按照题目写出理想代码,but  出现了不理想的效果 

按照我们的预想,输出一个字母,就会输出  is an alphabet.   ,不是字母就会输出  is not an alphabet. 我来看一下运行结果。

对于getchar( )函数的理解_第3张图片 

按照题目写出理想代码,but  出现了不理想的效果  

此时大家会发现和我们预想的不太一样,每一次输出,总是会多输出一个 is not an alphabet. 导致在提交代码的时候出现格式错误。为什么会这样呢?(让人很头痛)

               对于getchar( )函数的理解_第4张图片

(2)原因分析(原理详解)

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

对于getchar( )函数的理解_第5张图片

  看懂这个原理后,我们再回到之前的代码上,再次进行代码图解分析。

代码:getchar()   此时先输入一个字符  例如输入一个 A 吧!

分析:在程序开始运行之后,缓冲区里什么都没有,我们只能通过键盘输入 A ,为了让字符A 进入缓冲区 我们其实不知不觉中输入了  \n  最终在缓冲区里出现的是  A\n

那我们再次看图:

对于getchar( )函数的理解_第6张图片

此时缓冲区放了 A\n

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

因为此时是连续输入,第一个getchar()通过键盘的输入从缓冲区取走了 A ,第二个getcgar()发现缓冲区有一个 \n 刚刚好不需要从键盘输入,直接拿走了 \n 。

经过分析,发现了问题原来每次多输出的那个 is not an alphabet. 就是 \n 导致的呀。

(3)解决方法

此时我们的方向就很明确了,只需要在每次输入完一个字符后先把缓冲区里的请空即可。此时就用到getchar 的另外一个用法,将缓冲区里面的 \n 清除掉。在代码中,需要在每次while()循环开始加入 getchar()函数,清除每一次的 \n。

#include
int main()
{
    char a;
    while ((a = getchar()) != EOF)
    {
        getchar();
        if ((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
            printf("%c is an alphabet.\n", a);
        else
            printf("%c is not an alphabet.\n", a);
    }
    return 0;
}

这时我们再来看运行代码: 

对于getchar( )函数的理解_第7张图片

此时运行代码,发现终于成功了。 

 对于getchar( )函数的理解_第8张图片

你可能感兴趣的:(算法)