文章目录

  • 关于getchar()函数的基本作用
  • getchar()函数基本案例
  • 在循环当中的getchar()
  • getchar()函数的作用
  • 清理缓冲区中多个字符

关于getchar()函数的基本作用

getchar()函数顾名思义就是获取一个字符,那么他从何处获取,返回值类型又是什么让我们在MSDN中找寻答案

我们可以看到getchar()函数的作用是从stdin(标准输入——键盘)获取字符,他的返回值类型是int,那我们不禁要问了,为什么getchar()读取的是一个字符而返回的却是整形呢,因为字符在存储时是以阿斯克码值存储的,返回整形是返回了他的阿斯克码值,当getchar()读取错误的时候会返回EOFEOF的含义就是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,之后我们使用printfputchar()函数分别打印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()函数进入缓冲区,没有字符可以获取,进行等待,用户输入后获取字符进行判断。