库函数查找的链接: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) ?输出结果一样?
例题:
#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;
}
按照我们的预想,输出一个字母,就会输出? 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<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;
}
这时我们再来看运行代码:?
此时运行代码,发现终于成功了。?
?