C语⾔:getchar()函数详解
⽂章⽬录
getchar( ) 函数定义
getchar() - 字符输⼊函数,没有参数,从输⼊缓冲区⾥⾯读取⼀个字符 - 「 ⼀次只能读取⼀个字符 」
EOF(-1) - end of file ⽂件结束标志 - 键盘上⽤ ctrl + z 实现
先查⼀下⽂档
函数返回值
该函数以⽆符号 char 强制转换为 int 的形式返回读取的字符,如果到达⽂件末尾或发⽣读取错误,则返回 EOF(-1)。所以 getchar() 函数返回值要⽤ int 整型变量来存储
#include<stdio.h>
int main()
{
int ch =0;
while((ch =getchar())!=EOF)
{
putchar(ch);
}
return0;
}
运⾏结果:键盘上输⼊ abc\n,程序会在屏幕上输出 abc\n,输⼊ def\n,屏幕上会输出 def\n,当按下 ctrl + z 时程序结束运⾏
这是为什么呢,程序的运⾏过程是这样的,getchar 有⼀个 int 型的返回值。当程序调⽤ getchar 时,程序就等着⽤户按键。⽤户输⼊的字符被存放在键盘缓冲区中,直到⽤户按回车为⽌(回车字符 \n 也放在缓冲区中),当⽤户键⼊回车之后,getchar() 函数才开始从输⼊缓冲区中每次读取⼀个字符,getchar 函数的返回值是⽤户输⼊的字符的 ASCII 码,若遇到⽂件结尾 (End-Of-File) 则返回 -1 (EOF),
并将⽤户输⼊的字符回显到屏幕,如果⽤户在按回车之前输⼊了不⽌⼀个字符,其他字符会保留在键盘缓存区中,等待后续 getchar 调⽤读取。也就是说,后续的 getchar 调⽤不会等待⽤户按键,⽽直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待⽤户按键。程序中 while 循环⼯作时,每⼀次循环 getchar() 就会从输⼊缓冲区读取⼀个字符,然后 putchar 输出,直到遇到了⽂件结束标志 EOF,循环判断条件为假,循环才结束
为啥⽤缓冲区呢?因为计算机CPU的处理速度是很快的,我们⽤键盘输⼊速度⽐不上CPU的处理速度,CPU就得等键盘输⼊完,很浪费资源,所以,当键盘输⼊完了,让CPU⼀次性处理,可以⼤⼤提⾼效率。
参考⽂章:
注意区分 getchar 和 scanf
对于 scanf 函数,'\n' 会触发 scanf 读取输⼊缓冲区的内容,但遇到 '\n' 或空格 ' ' 会停⽌读取,⽽ getchar 会直接读取 '\n' 和空格
// scanf多组输⼊,s,⽐如2008 6,使⽤下⾯语句,直到遇到'\n',停⽌读取
while(scanf("%d",&n)!=EOF){}
getchar 的使⽤实例
再来看⼀个和 getchar() 函数相关的实例:模拟密码输⼊
#include<stdio.h>
int main()
{
char password[20]={0};
//输⼊密码
printf("Input password:");
scanf("%s", password);
//确认密码
printf("Comfirm password(Y/N):");
c语言char的用法
int ch =0;
ch =getchar();
//判断是否确认成功
if(ch =='Y')
{
printf("success!\n");
}
else
{
printf("defeat!\n");
}
return0;
}
运⾏结果:
输⼊密码 123456 之后,程序没有让我们确认密码,直接判断确认失败了,为什么会出现这样的结果呢?
当我们在键盘上输⼊密码并按下回车后,键盘缓冲区有 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘\n’ 这些字符,此时 scanf 函数开始读取字符串 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ,遇到 ‘\n’ 结束读取,这时运⾏到后⾯的 getchar 函数了,getchar 发现缓冲区⾥还有⼀个 ‘\n’ ,直接将其读取⾛并会返回给整型变量 ch,这时没有多余的 getchar 函数来接收字符 ‘Y’ 或者 ‘N’ 了,轮到 if 语句来判断时,ch 不等于 ‘Y’ ,输出 defeat!
那我们怎么改进,让字符 ‘Y’ 或者 ‘N’ 得以被接收呢,猜你已经想到了,那就是在 ch = getchar(); 语句前⾯增加⼀条 getchar(); 语句,来读取处理掉 ‘\n’ ,这样⽤来确认密码的那个 getchar 函数就可以接收字符 ‘Y’ 或者 ‘N’ 了
继续思考,如果我输⼊密码时多输了⼀些⽆⽤的字符,⼜该怎么样处理掉它们呢?⽐如输⼊ 123456 abcdf\n
需要写⼀个循环来读取处理掉⽆⽤的字符
修改后的代码如下:
#include<stdio.h>
int main()
{
char password[20]={0};
//输⼊密码
printf("Input password:");
scanf("%s", password);
//---清理缓冲区---
int temp =0;
while((temp =getchar())!='\n')
{
;
}
//确认密码
printf("Comfirm password(Y/N):");
int ch =0;
ch =getchar();
/
/判断是否确认成功
if(ch =='Y')
{
printf("success!\n");
}
else
{
printf("defeat!\n");
}
return0;
}
运⾏结果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论