探讨getchar与scanf的区别
前言
说到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的区别相关推荐
- 浅谈getch(),getche(),getchar(),gets(),scanf()的区别
getch(),getche(),getchar(),gets(),scanf()的区别,综合很多博客的文章. getch()和getchar() getchar()是C的标准库函数,包含在头文件&l ...
- getchar与scanf的区别
getchar getchar先读取一个字符放到ch里面去,如果这个字符不等于EOF,就进入循环,打印这个字符.当getchar读到文件末尾或者结束时,它会返回一个EOF,此时结束循环. 输入A,输出 ...
- getchar、scanf以及缓冲区的概念
1.getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了. getch()和getche()是conio. ...
- fgets和scanf的区别
fgets和scanf的区别 1.测试使用scanf的一个例子: [cpp] view plaincopyprint? #include "stdio.h" #include &q ...
- C++中cin、cin.get()、cin.getline()、getline()、gets()、getchar()、scanf()等函数的用法
转自:https://www.cnblogs.com/luolizhi/p/5746775.html 1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include & ...
- 七.getchar 和 scanf
目录 准备 1.getchar函数 1.1特点: 1.2getchar在缓存区接收字符 代码 显示 原因: 2.scanf 2.1读入字符 代码 显示 2.2读字符串 代码 显示 原因 3.扩展 3. ...
- 【C语言】C语言学习整理-putchar,printf,getchar,scanf定义及区别
1.定义 花一点时间认真阅读,这篇文章应该会让您多理解一点东西. 1.getchar getchar函数是字符输入函数,其功能是从键盘上获取一个输入字符. 读取方式: 从stdio(输入)流中读字符, ...
- Gets和scanf的区别
char s[20]; gets(s); puts(s); gets与scanf输入字符串的方式也非常类似,但是有几个区别: (1) gets的输入分割符只有回车,因此gets是能够读入空格的.如果输 ...
- 关于fgetc,getc,getchar和scanf的一些小知识
在C语言中,一个char类型的字符可以用int型的数参照ASCII表来表示,比如 char ch = 49; printf("%c", ch); 这段代码会输出1,因为字符**'1 ...
最新文章
- AtomicBoolean 的使用与介绍
- leetcode 125. 验证回文串
- 论游戏项目中的左与右
- java 读取raw文件_Android 读取assets和raw文件内容实例代码
- JAVA 多用户商城系统b2b2c- 服务消费者(rest+ribbon)
- 用漫画让你彻底搞懂 Linux 内核到底长啥样!
- (day 53 - 动态规划 ) 剑指 Offer 63. 股票的最大利润
- 华为p8升级android8系统资源,华为畅享8官方固件rom刷机包_畅享8完整版系统升级包下载...
- gmail 设置 smtp_如何在Linux上使用Gmail或SMTP设置电子邮件警报
- SQL语句之查询进阶篇---上
- 智能计算系统课程笔记05:编程框架机理
- Anaconda创建虚拟环境时报错 InvalidArchiveError Error with archive D:\\(anaconda的路径)\\pkgs\\vs2015_runtime
- 香港银行开户多少钱能开下来
- 【基于深度学习的细粒度分类笔记2】弱监督学习下商品识别:CVPR 2018细粒度识别挑战赛获胜方案简介
- 嵌入式学习之QT学习---8 QT网络编程之TCP通信
- fffffffffffffffffffffffffffffffff
- HP孙振耀退休感言(转载)
- 格式工厂安装与使用教程
- dedecms教程:织梦未审核文档禁止动态浏览
- python 双色球 输出到txt_python3 - 写一个生成双色球号码的一个程序,生成的号码写到文件里面...