前言

说到scanf与getchar,想必大家都不陌生,在学习C语言的第一天起我们就开始接触它们,但我们对它们在输入方面可能有点模棱两可,分不清scanf与getchar真正有什么区别,下面就来分别探讨一下scanf与getchar在输入上的特点。

scanf在输入上的特点

当我们在运用scanf这个函数需要输入字符串或者数字时,scanf并不是直接从我们的键盘当中直接获取输入的信息,而是从缓冲区中获取信息,这个所谓的缓冲区,是我们在键盘上输入后暂时保存输入信息的地方。当对于输入的信息放在缓冲区中存在空格时,scanf函数只能获取空格前的信息(正常情况下)。这是scanf函数的弊端。

getchar在输入上的特点

在输入字符或数字时运用getchar,它只能向缓冲区中读取单个字符,能够读取的内容非常地少,因此我们在运用getchar时大多时候要利用循环来进行读取,但它并不是没有优点,它能够弥补scanf在输入上读取字符的不足。当getchar向缓冲区读取字符时,'\0'与' '它都能够读取,因此我们有时利用循环来判断ch = getchar() != EOF来读取字符。

以上的ch其实是int类型的,总是有不少人会问getchar读取的不是字符吗,为什么会用int去接收呢?仔细思考,getchar只能读取单个字符,那单个字符一定会有它的ASCII码值,那么就要用int类型的变量去接收。

举例体现scanf与getchar特点

例题:利用scanf与getchar来输入密码,输入密码后需要确认密码,选择Y则确认成功,否则确认失败。

大部分人的思路:先用scanf输入密码保存在一个数组中,再用getchar输入Y或N确认密码。(错误示范)代码如下:

#include <stdio.h>
int main()
{char password[20] = { 0 };printf("请输入密码->:\n");scanf("%s", password);printf("请确认密码:(Y/N):\n");int ch = getchar();if (ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;
}

当我们运行时结果为:

我们可以看到,当我们输入密码后还没来得及输入Y或N运行结果就显示确认失败,其实就是缓冲区的问题,当我们输入abcdef再输入一个回车时,scanf就在缓冲区内读取了abcdef,而回车也代表一个字符'\n',getchar就从缓冲区上读取了这个回车,回车不等于Y,则确认失败。正确的代码应该为:

#include <stdio.h>
int main()
{char password[20] = { 0 };printf("请输入密码->:\n");scanf("%s", password);getchar();printf("请确认密码:(Y/N):\n");int ch = getchar();if (ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;
}

运行结果为:

我们修改的地方只是在scanf的后面加了一个getchar读取走输入abcdef后的回车,此时缓冲区内没有任何字符,这时我们就能在确认密码时输入Y或N,但它仍有一定的弊端,在我们输入ab cd时问题又会出现,运行时又会在没有输入Y或N就确认失败,结果如图:

出现bug的原因在于scanf只会在缓冲区内接收ab,空格和cd它并没有接受,当只有一个getchar时只能读取空格,这时我们应该利用循环,多次用getchar来读取字符,直到读取的是\0为止。代码如下:

#include <stdio.h>
int main()
{char password[20] = { 0 };printf("请输入密码->:\n");scanf("%s", password);getchar();while (getchar() != '\n'){;}printf("请确认密码:(Y/N):\n");int ch = getchar();if (ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;
}

这时当我们输入ab cd就能够确认密码:

看到此处我相信你一定对scanf与getchar在输入的特点上有了比较充分的理解,如果博客对您有帮助请点个赞支持作者,后续仍然会发表C语言学习的文章谢谢。

探讨getchar与scanf的区别相关推荐

  1. 浅谈getch(),getche(),getchar(),gets(),scanf()的区别

    getch(),getche(),getchar(),gets(),scanf()的区别,综合很多博客的文章. getch()和getchar() getchar()是C的标准库函数,包含在头文件&l ...

  2. getchar与scanf的区别

    getchar getchar先读取一个字符放到ch里面去,如果这个字符不等于EOF,就进入循环,打印这个字符.当getchar读到文件末尾或者结束时,它会返回一个EOF,此时结束循环. 输入A,输出 ...

  3. getchar、scanf以及缓冲区的概念

    1.getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了. getch()和getche()是conio. ...

  4. fgets和scanf的区别

    fgets和scanf的区别 1.测试使用scanf的一个例子: [cpp] view plaincopyprint? #include "stdio.h" #include &q ...

  5. C++中cin、cin.get()、cin.getline()、getline()、gets()、getchar()、scanf()等函数的用法

    转自:https://www.cnblogs.com/luolizhi/p/5746775.html 1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include & ...

  6. 七.getchar 和 scanf

    目录 准备 1.getchar函数 1.1特点: 1.2getchar在缓存区接收字符 代码 显示 原因: 2.scanf 2.1读入字符 代码 显示 2.2读字符串 代码 显示 原因 3.扩展 3. ...

  7. 【C语言】C语言学习整理-putchar,printf,getchar,scanf定义及区别

    1.定义 花一点时间认真阅读,这篇文章应该会让您多理解一点东西. 1.getchar getchar函数是字符输入函数,其功能是从键盘上获取一个输入字符. 读取方式: 从stdio(输入)流中读字符, ...

  8. Gets和scanf的区别

    char s[20]; gets(s); puts(s); gets与scanf输入字符串的方式也非常类似,但是有几个区别: (1) gets的输入分割符只有回车,因此gets是能够读入空格的.如果输 ...

  9. 关于fgetc,getc,getchar和scanf的一些小知识

    在C语言中,一个char类型的字符可以用int型的数参照ASCII表来表示,比如 char ch = 49; printf("%c", ch); 这段代码会输出1,因为字符**'1 ...

最新文章

  1. AtomicBoolean 的使用与介绍
  2. leetcode 125. 验证回文串
  3. 论游戏项目中的左与右
  4. java 读取raw文件_Android 读取assets和raw文件内容实例代码
  5. JAVA 多用户商城系统b2b2c- 服务消费者(rest+ribbon)
  6. 用漫画让你彻底搞懂 Linux 内核到底长啥样!
  7. (day 53 - 动态规划 ) 剑指 Offer 63. 股票的最大利润
  8. 华为p8升级android8系统资源,华为畅享8官方固件rom刷机包_畅享8完整版系统升级包下载...
  9. gmail 设置 smtp_如何在Linux上使用Gmail或SMTP设置电子邮件警报
  10. SQL语句之查询进阶篇---上
  11. 智能计算系统课程笔记05:编程框架机理
  12. Anaconda创建虚拟环境时报错 InvalidArchiveError Error with archive D:\\(anaconda的路径)\\pkgs\\vs2015_runtime
  13. 香港银行开户多少钱能开下来
  14. 【基于深度学习的细粒度分类笔记2】弱监督学习下商品识别:CVPR 2018细粒度识别挑战赛获胜方案简介
  15. 嵌入式学习之QT学习---8 QT网络编程之TCP通信
  16. fffffffffffffffffffffffffffffffff
  17. HP孙振耀退休感言(转载)
  18. 格式工厂安装与使用教程
  19. dedecms教程:织梦未审核文档禁止动态浏览
  20. python 双色球 输出到txt_python3 - 写一个生成双色球号码的一个程序,生成的号码写到文件里面...

热门文章

  1. Java创建对象的四种方式
  2. 最新YzmCMS全新轻爽极简风格模版主题(Eric v1.0)
  3. py基础教程学习(1)
  4. 《微积分的力量》读后感
  5. 登录(记住账号密码、获取后台数据)
  6. iOS14系统下按钮点击没有反应
  7. Ubuntu20.04安装CUDNN、Ceres和Colmap
  8. 全国青少年信息素养大赛图形化编程决赛·模拟二卷,含答案解析
  9. linux mkdir命令是什么意思,Linux中mkdir命令起什么作用呢?
  10. 屏幕缩小1 1html,电脑屏幕变小了左右黑几种解决方法