一、getchar函数
1.作用:
该函数的作用是接收一个字符,然后把该字符转化对应的ASCII值
2.认识函数
int getchar(void)//getchar函数原型
参数类型:括号里面的void意思是不接受参数,就是括号里面不需要写任何东西
函数作用:该函数的作用是接收一个字符,然后把该字符转化对应的ASCII值
返回值类型:因为接受一个字符后会把该字符转化成对应ASCII码值,所以返回值的ASCII码值,所以返回值的类型是整形(int)。如果getchar函数接受字符失败或者遇到文件末尾,那么他就会返回一个EOF的值,EOF的值默认为-1
3.运用
我们现在要输入大写的A,然后输出A和对应的ASCII码值
#include<stdio.h> int main() { //int ch=getchar();//这样子定义也是可以的 int ch = 0; ch = getchar();//第一步,getchar会接受你冲键盘输入的值 printf("%c\n", ch);//第二步,直接打印该字符 printf("%d\n",ch);//打印该字符对应的ASCII码值 return 0; }
接下来我们类比一下两种不同接收字符的方式
相同点:都可以用来输入(接收)一个字符。
不同点:getchar函数只能用来接收字符,而接收字符只是scanf函数的一种形似。
优点 :getchar函数可以不需要变量来接收,(需要打印该字符的时候)也可以拿一个变量来接收它的返回值;但是,sacnf函数必须要有一个变量来接收,无论你要不要打印。
二、putchar函数
1.作用
在屏幕上输出(打印出)一个字符
2.定义
int putcahr(int charatcer)//putchar函数原型
函数的参数类型:这里需要的参数是一个整形字符,就是括号里面需要写的值。
函数的作用:把参数打印在屏幕上,putchar本质就是输出函数
注意:每次只可以输出一个字符
返回值类型:其返回值是输出的字符的ASCII码(即整数),若输出失败则返回EOF(常量,一般定义为-1)。
3.运用
输出的字符的方式有两种:第一种是用变量来输出,第二种是直接输出字符
//第一种输出方式 #include<stdio.h> int main() { int ch1=getchar(); int ch2=getchar(); putchar(ch1);//将字符存在变量中 putcahr(ch2);//依靠变量来输出字符 return 0; } //第二种输出方式 #include<stdio.h> int main() { putchar('A');//不需要变量,直接输出字符 putchar('B'); return 0; }
三、getchar与putchar的运用
一般是与getchar函数配合使用。
我们要在屏幕上面输出:AB
#include<stdio.h> int main() { int ch1 = getchar(); int ch2 = getchar();//接受字符 putchar(ch1); putchar(ch2);//打印字符 return 0; }
四、getchar的应用
应用:清空缓冲区
题目:用代码实现密码输入并确认的场景
#include<stdio.h> int main() { char arr[20] = {0}; printf("请输入密码\n"); scanf("%s",arr);//这里我们先从键盘输入密码,然后回车 printf("请确认(Y/N):");//这里我们需要再次确认我们输入的密码 int ch = getchar();//getchar负责接受Y或N if ('Y' == ch) printf("确认成功\n"); else printf("确认失败\n"); return 0; }
我们把上述代码运行起来
为什么呢?听完缓缓道来!原因是getchar接收的是回车这个字符,回车这个键一般相当于\n,所以这个时候ch里面存放的数据是'\n',所以'Y'!=ch,直接就显示确认失败了。
我们先了解一个东西:scanf函数和getchar函数接收数据是借助缓冲区,而缓冲区上面的数据依靠键盘来输入,我们看一个图。
什么意思呢?我用上面代码演示一下:
第一步:运行程序
因为程序刚刚运行起来,我们没有从键盘上面输入数据,所以缓冲区上面是没有东西的,就是为空的,所以光标在闪,在等待我们输入。
第二步:输入数据(密码)并回车让scanf函数接收密码
这里回车键相当于\n。所以sacnf函数从缓冲区里面拿走的是abcdf,缓冲区上面还剩\n。当getchar函数接收字符的时候只能拿走\n,所以为什么没有输入Y或N屏幕上就显示确认失败了
补救方法:再用一个getchar函数接收掉\n
改进代码:
#include<stdio.h> int main() { char arr[20] = {0}; printf("请输入密码\n"); scanf("%s",&arr); getchar();//这个getchar用于接收\0 printf("请确认(Y/N):"); int ch = getchar(); if ('Y' == ch) printf("确认成功\n"); else printf("确认失败\n"); return 0; }
我们运行并实现看看:
我们可以看到,已经可以起到我们预期的结果了。
但是呢!还是会有bug,因为scanf函数在读取字符串的时候,遇到空格就不会再读取。我们运行起来一看便知道
运行结果:
因为一个getchar只能处理一个空格,后面的内容无法处理。那为什么不多加几个getchar呢?这样的后果你又怎么知道用户会输入多少个空格呢? 所以我们需要用循环进行改造
第二次改造的代码:完整代码展示
#include<stdio.h> int main() { char arr[20] = {0}; printf("请输入密码\n"); scanf("%s",&arr); int ch = 0; while ((ch=getchar())!='\n')//新改进代码,用循环接收字符 { //直到接收完\n才结束循环 ;//我们循环getchar函数,所以循环体不需要执行任务语句,只需要一句空语句就可以 } printf("请确认(Y/N):"); ch = getchar(); if ('Y' == ch) printf("确认成功\n"); else printf("确认失败\n"); return 0; }
两次改造后,无论你怎么输入密码,都不会出现问题,都可以稳稳让你输入Y或N来确认密码
清空缓冲区的关键代码:
int ch = 0; while ((ch=getchar())!='\n') { ; }
五、总结
1.getchar是一个接收字符的函数,接收成功返回字符的ASCII值,失败返回EOF(-1)
2.putchar是一个打印字符的函数,会在屏幕上面打印出该字符
3.合理运用getcharh函数可以达成清空缓冲区的效果