C语言 getchar()原理及易错点解析

1.getchar()工作原理及作用

  • 作用1:从缓冲区读走一个字符,相当于清除缓冲区。
  • 作用2:前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,接下来的scanf()就不会等待从键盘键入字符,而是会直接取走这个"无用的"回车符,从而导致读取有误。

2.使用getchar()清理回车\n

cpp 复制代码
#include <stdio.h>

int main(void){
    char m[40];
    char n;
    printf("please input first str:\n");    //提示用户输入第一个字符串
    scanf("%s",m);                         //获取用户第一个输入字符串
    printf("you input str is :%s\n",m);    //输出用户的输入的第一个字符串
    printf("input second char :\n");        //提示用户输入第二个字符
    scanf("%c",&n);                         //获取用户的第二个字符
    printf("now you input second char is :%c\n",n);//输出用户输入的第二个字符
    return 0;
    
}

please input first str:

abc

you input str is :abc

input second char :

now you input second char is :

Program ended with exit code: 0

原因:

其实在我们第一次输入并按下回车的时候,控制台一共获得了四个字符,分别是:a、b、c、回车(enter)。但是因为scanf()方法遇到非字符的时候会结束从控制台的获取,所以在输入'abc'后,按下 '回车(enter)' 的同时,将'abc'这个值以字符串的形式赋值给了类型为 'char' 的 'm' 数组,将使用过后的字符串: '回车(enter)' 保存在控制台输入的缓冲区,然后继续执行下一段输出代码,然后又要求用户输入。此时,因为上一次被使用过后的字符串被保存在缓冲区,现在scanf()方法从控制台的缓冲区获取上一次被使用过后的字符串,并只截取第一个字符: '回车(enter)' ,此时控制台缓冲区才算使用完了。所以在看似被跳过的输入,其实已经scanf()方法已经获取了我们的输入了,这个输入就是一个 '回车(enter)' 。

解决问题:
使用getchar()方法,清除掉abc后面的缓存(回车enter)。

cpp 复制代码
#include <stdio.h>

int main(void){
    char m[40];
    char n;
    printf("please input first str:\n");    //提示用户输入第一个字符串
    scanf("%s",m);                         //获取用户第一个输入字符串
    printf("you input str is :%s\n",m);    //输出用户的输入的第一个字符串
    getchar();
    printf("input second char :\n");        //提示用户输入第二个字符
    scanf("%c",&n);                         //获取用户的第二个字符
    printf("now you input second char is :%c\n",n);//输出用户输入的第二个字符
    return 0;
    
}

please input first str:

abc

you input str is :abc

input second char :

de

now you input second char is :d

Program ended with exit code: 0

相关推荐
kimnoic17 小时前
Python数据库学习心得:SQLite、MySQL、PostgreSQL优缺点
开发语言·python
必须得开心呀18 小时前
python编写带界面的软件,需要安装哪些插件
开发语言·python
沫璃染墨20 小时前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
达子66621 小时前
RUST 图解 第 3 章:通用编程概念(Common Programming Concepts)
开发语言·算法·rust
道尔柯南21 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
楠楠子呀21 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具
Navigator_Z21 小时前
LeetCode //C - 1288. Remove Covered Intervals
c语言·算法·leetcode
tachibana221 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
临床数据科学和人工智能兴趣组1 天前
正则表达式的基础语法的基本符号
开发语言·人工智能·python·正则表达式·r语言·r语言-4.2.1·workbudyy
王中阳Go1 天前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型