库函数查找的链接: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) 输出结果一样
例题:
判断是不是字母_牛客题霸_牛客网
#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;
}
按照我们的预想,输出一个字母,就会输出 is an alphabet. ,不是字母就会输出 is not an alphabet. 我来看一下运行结果。
按照题目写出理想代码,but 出现了不理想的效果
此时大家会发现和我们预想的不太一样,每一次输出,总是会多输出一个 is not an alphabet. 导致在提交代码的时候出现格式错误。为什么会这样呢?(让人很头痛)
输入函数的原理:在输入函数中包含了 scanf()函数和 getchar()函数,它们都是从键盘上来读取我们的数据,但它们不是直接从键盘上来读取我们的数据。它们和键盘之间有一个区域叫缓冲区。输入函数先来看缓冲区中是否有数据,如果有,它直接就拿走了,不需要从键盘输入,如果缓冲区什么都没有,则需要从键盘输入,再拿走。
看懂这个原理后,我们再回到之前的代码上,再次进行代码图解分析。
代码:getchar() 此时先输入一个字符 例如输入一个 A 吧!
分析:在程序开始运行之后,缓冲区里什么都没有,我们只能通过键盘输入 A ,为了让字符A 进入缓冲区 我们其实不知不觉中输入了 \n 最终在缓冲区里出现的是 A\n
那我们再次看图:
此时缓冲区放了 A\n
注意:getchar() 函数 每次只能取走一个字符
因为此时是连续输入,第一个getchar()通过键盘的输入从缓冲区取走了 A ,第二个getcgar()发现缓冲区有一个 \n 刚刚好不需要从键盘输入,直接拿走了 \n 。
经过分析,发现了问题原来每次多输出的那个 is not an alphabet. 就是 \n 导致的呀。
此时我们的方向就很明确了,只需要在每次输入完一个字符后先把缓冲区里的请空即可。此时就用到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;
}
这时我们再来看运行代码:
此时运行代码,发现终于成功了。