对于getchar( )函数的理解

2023-12-29 17:08:56

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

库函数查找的链接:cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/ ?

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

原因如下:?

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

(注意:EOF意思是end of file,本质上是-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) ?输出结果一样?

三、getchar()函数实战演练?

例题:

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

#include<stdio.h>
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. 我来看一下运行结果。

?

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

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

? ? ? ? ? ? ? ?

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

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

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

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

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

那我们再次看图:

此时缓冲区放了 A\n

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

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

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

(3)解决方法

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

#include<stdio.h>
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;
}

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

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

?

文章来源:https://blog.csdn.net/2301_79763109/article/details/135176973
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。