文章目录
- 关于getchar()函数的基本作用
- getchar()函数基本案例
- 在循环当中的getchar()
- getchar()函数的作用
- 清理缓冲区中多个字符
关于getchar()函数的基本作用
getchar()
函数顾名思义就是获取一个字符,那么他从何处获取,返回值类型又是什么让我们在MSDN中找寻答案
我们可以看到getchar()
函数的作用是从stdin(标准输入——键盘)获取字符,他的返回值类型是int
,那我们不禁要问了,为什么getchar()
读取的是一个字符而返回的却是整形呢,因为字符在存储时是以阿斯克码值存储的,返回整形是返回了他的阿斯克码值,当getchar()
读取错误的时候会返回EOF
,EOF
的含义就是end of file,是文件的结束标志
我们可以在编译器中转到定义发现EOF
就是-1,也符合getchar()
函数的返回值类型int
。总结一下:
1.
getchar()
函数的作用是从标准输入键盘中读取一个字符
2.getchar()
的返回值类型为整形,返回的是读取到字符的阿斯克码值
3.当getchar()
函数读取失败时,返回EOF
文件的结束标志。
以上就是带大家基本了解了一下getchar()
函数。
getchar()函数基本案例
首先我们在代码中深入理解getchar()
函数
#includeint main(){int ch = getchar();printf("%c\n", ch);putchar(ch);return 0;}
我们看到当我们在键盘中输入大写的A,getchar()
函数会获取到我们输入的A并赋值给ch
,之后我们使用printf
和putchar()
函数分别打印ch
,结果如上图。那么getchar()
函数是如何获取到我们输入的字符的呢?其实getchar()
是从缓冲区中读取到的字符
一开始我们并没有输入任何字符,所以getchar()
函数会在缓冲区等待,当我们键盘输入A并且按下回车时,在缓冲区中就会有A和\n两个字符
这时候getchar()
函数发现了缓冲区中的字符拿走了A,赋值给了ch。
在循环当中的getchar()
int main(){int ch = 0;while ((ch = getchar()) != EOF){putchar(ch);}return 0;}
如上图,将getchar()
函数放在while循环当中作为条件,就可以实现连续输入和打印,那么这个代码的逻辑是怎样的呢?首先我们创建一个整形变量用于接收字符,用户键盘输入进入判断,如果getchar()
正常获取字符那么我们进入循环打印字符,再次输入,如果getchar()
获取字符异常返回EOF
那么就跳出循环。我们用一个逻辑图让大家加强理解
当我们输入A+回车时会在缓冲区出现A\n两个字符,这时getchar()
进入缓冲区拿去字符A,并且进入循环打印字符A,打印完成结束第一次循环,第二次循环开始,getchar()
再次进入缓冲区拿去转义字符\n
,第二次进入循环,打印\n
换行,带三次循环,这时getchar()
进入缓冲区时,缓冲区没有字符了,开始等待用户输入,直到getchar()
获取失败返回EOF
跳出循环。
getchar()函数的作用
上面的代码我们理解了之后,我们会想问这样的代码到底有什么用呢,为什么我们要学习getchar()
函数呢,我们来看下面这个代码
int main(){char password[20] = {0};printf("请输入密码:\n");scanf("%s", password);printf("请确认密码(Y/N):");int ch = getchar();if (ch == 'Y'){printf("密码正确\n");}else{printf("密码错误\n");}return 0;}
我们想要的逻辑是,当我们输入密码后,再次输入Y/N来确认密码是否正确,但是我们发现,输出的结果当中,我们并没有输入Y或者N,他自动输出了密码错误,这是为什么呢?
当我们第一次输入时我们输入123456回车,我们在缓冲区会出现123456\n 7个字符,当我们的scanf
在缓冲区中拿取字符时只会拿取123456,到\n
了会停止拿取,当代码执行到getchar()
时,缓冲区中存在的字符\n
会直接被拿走放入ch
当中,进入判断ch
不等于Y,输出密码错误,那么如何解决这样的问题呢?我们提前把\n拿走是不是就可以了。
int main(){char password[20] = {0};printf("请输入密码:\n");scanf("%s", password);printf("请确认密码(Y/N):");getchar();int ch = getchar();if (ch == 'Y'){printf("密码正确\n");}else{printf("密码错误\n");}return 0;}
我们在判断之前在加一个getchar()
函数,提前将缓冲区中的\n
取走,就可达到我们想要的目的,这样的方法叫做清理缓冲区。
清理缓冲区中多个字符
上面我们了解了当有一个\n
的时候如何达到我们的目的,那么如果是多个字符呢?
int main(){char password[20] = {0};printf("请输入密码:\n");scanf("%s", password);printf("请确认密码(Y/N):");getchar();int ch = getchar();if (ch == 'Y'){printf("密码正确\n");}else{printf("密码错误\n");}return 0;}
我们发现当我们在正确的密码后输入空格和其他字符时,我们的代码并不能正常运行,因为getchar()
只能获取一个字符能力有限,所以我们需要对我们的代码进行改进。
int main(){char password[20] = { 0 };printf("请输入密码:\n");scanf("%s", password);printf("请确认密码(Y/N):");//getchar();int tmp = 0;while ((tmp = getchar()) != '\n'){;}int ch = getchar();if (ch == 'Y'){printf("密码正确\n");}else{printf("密码错误\n");}return 0;}
如图我们将getchar()
放入while循环当中就可以实现缓冲区中多个字符的清除,当scanf
进入缓冲区获取字符时会拿取123456,遇到空格scanf
停止获取,之后进入循环getchar()
进入缓冲区读取字符,只要没有读到\n
循环就继续执行,遍历完缓冲区字符后,最后获取\n
跳出循环,在进行我们的密码判断,此时用于获取判断字符的getchar()
函数进入缓冲区,没有字符可以获取,进行等待,用户输入后获取字符进行判断。