输入函数scanf,gets,getchar简单区别测试

33 篇文章 23 订阅
订阅专栏

其实这些函数的具体应用和区别应该早就清楚了—-
= =··· 但是鄙人实在是很foolish+shiftless。。所以每次遇到这些大同小异的函数们都会屁颠儿屁颠儿的找度娘。。今天实在是忍不了了。于是乎举起了keyboard和cute mouse,来把它们小区分一下。。可能会有些杂乱。。因为实在是。。。

今天的讲述偏重于这些函数对空格,回车,TAB等的不同的测试。

一、scanf()
一些基本的解释看以下博客:
http://blog.csdn.net/mdx20072419/article/details/8543388

Little Test:

#include <stdio.h>
int main()
{
    char ch1, ch2;
    scanf("%c", &ch1);
    scanf("%c", &ch2);
    printf("%d %d\n", ch1, ch2);
    return 0;
}

运行结果如下:
这里写图片描述
原因如下:
scanf从输入流缓冲区中提取数据,并非在键盘缓冲区里面提取数据。
1.当我们用键盘输入一个a的时候,然后会按enter,在按enter之前,a在键盘缓冲区,而输入流缓冲区里面并没有东西,getchar处于等待状态。
2.当我按下enter之后,字符a和enter都进入输入流缓冲区,getchar开始读取一个字符a,然后再读取一个enter,输入流缓冲区已经没有东西了。此时我们也输出了。

趁热打铁:

#include <stdio.h>
int main(){
    char ch1,ch2;
    //注意第一个scanf里面的空格
    scanf("%c %c",&ch1,&ch2);
    printf("%d %d\n",ch1,ch2);

    scanf("%c%c",&ch1,&ch2);
    printf("%d %d\n",ch1,ch2);
    return 0;
}

提问:
第一个scanf和第二个scanf,都输入a b,会出现什么不同的结果?
这里写图片描述
你分析出来了么?
过程是这样的:
第一个scanf里面%c %c之间有一个空格,所以在输入字符a之后,我们可以输入空格,enter,或者任何一个字符,scanf都会自动忽略它,从而当我们输入字符b 的时候scanf准确无误的读入。因此printf得到的就是a和b对应的ASCII码97和98。此时输入流缓冲区里面仍然有一个enter(键入b之后按下的enter),所以第二次输入a和b,其实只读取了一个enter和a,于是得到的就是10和97。

深度挖掘:

#include <stdio.h>
int main()
{
    char str1[20], str2[20];
    scanf("%s",str1);
    printf("%s\n",str1);

    scanf("%s",str2);
    printf("%s",str2);
    return 0;
}

运行结果如下:
这里写图片描述
分析如下:
其实这里的原因和字符读入是一样的。
hello world!在按下enter以后,包括enter都进入到输入流缓冲区,
而scanf遇到 回车(enter),空格,TAB 就会停止,所以当第一个scanf遇到了hello以后的第一个空格时,就停止读取数据了.
因此str1就是hello,而 world!还在缓冲区中,所以第2个scanf会直接从输入流缓冲区中读取这些数据(已经把world前面的那些空格忽略)。
再执行一次:
这里写图片描述
空格被忽略。有个疑问,是因为scanf忽略空格了,还是printf忽略了?猜想应该是printf。等我再看看输出函数的时候再确定答案。读者也要想想哦~
再来一次:
这里写图片描述

二、getchar()和gets()
读者如果想要了解这俩函数的基本功能,建议在unix下man一下。
我man了一下,简单写写。(其实还有好多函数哦。。应该在uc下写的)

int getchar(void);
char *gets(char *s);
//这里最应该注意的是它们的返回类型。

Little Test1:

#include <stdio.h>
int main(){
    char ch1,ch2;
    ch1=getchar();
    ch2=getchar();
    printf("%d %d\n",ch1,ch2);
    return 0;
}

运行结果如下:
这里写图片描述
跟scanf的第一个例子是一样的,当然原理也是一样的。不再赘述。

Little Test2:

#include <stdio.h>
int main()
{
    char str1[20], str2[20];
    gets(str1);
    printf("%s\n",str1);

    gets(str2);
    printf("%s\n",str2);
    return 0;
}

运行结果如下:
这里写图片描述

解析如下:
gets和scanf和getchar不同之处在于gets可以接受空格。

以前编译代码的时候,总会发现黑窗口一闪就没了,并不会停留下来。这个时候经常会用system(“pause”);让它停留下来,有时候也会加getchar();为什么捏?
如果输入流缓冲区中没有数据,那么getchar就会处于等待状态,从而使黑窗口停留。但是如果有数据,黑窗口照样还是在getchar读完数据之后,一闪而过(你伤害了我,却一闪而过~~)

总结如下:
1.scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中)。
2.getchar()以Enter结束输入,也不会舍弃最后的回车符。
3.gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!

三、缓冲区刷新

缓冲区刷新是非常重要的,不然容易导致数据混乱,对我们的程序造成很大的影响。
这里只简述c里面最常用的刷新方式:

int fflush(FILE *stream);
//成功返回0

具体应用,自行百度。

c++具有特色的的输入输出函数的具体应用,下个博客再记。

scanf,getchar,gets三者的区别
weixin_72403836的博客
12-18 2131
前言🌸: 在刷牛客题的过程中我们总会遇到一组输入,多组输入输入一组字符串等等问题,那我们应该如何去更好更有效地解决它们呢?这里我们将学习scanf,getchar,gets含义及其用法。让我们一起开始今日的学习吧!宝子们😘 目录🌸: scanf的用法🎇 getchar的主要作用🌌 认识gets🎆 scanf,getchar,gets三者的区别🌠 废话不多说,让我们开始今日的学习吧😘 ①scanf输入函数是一个库函数,在使用时必须引用头文件stdio
C语言中的输入函数getchar()、get()、scanf()函数区别
沐凡星的博客
03-07 6552
例如:scanf("%c%c%c",&a,&b,&c):对输入“x y”时,x在变量a中,空格在变量b中,y在变量c中。注意,控制串中的其它字符,包括空格、制表符和新行符,用于从输入流中匹配并放弃字符作用。但是scanf("%s",str)不能接受含有空格符的字符串,scanf()函数取数据是遇到回车、空格、TAB就会停止,剩余字符串将留在缓冲区中。例如:scanf("%dt%d",&x,&y): 对于输入10t20时,将把 10 和 20 分别放到 x 和 y 中,t 被放弃,因为 t 在控制串中。
scanf()与getchar()函数区别
qq_39826006的博客
07-14 680
char str1[20], str2[20]; scanf(“%s”,str1); printf(“%s\n”,str1); scanf(“%s”,str2); printf(“%s\n”,str2); return 0; } 程序的功能是读入一个字符串输出,在读入一个字符串输出。可我们会发现输入字符串中不能出现空格,例如: 测试输入: Hello world! 输出: Hello world! 【分析】到此程序执行完毕,不会执行第二次的读取操作!这个问题的原因跟问题一类似,第一次输入Hello wo
scanfgetchar区别
z5148的博客
10-14 2044
循环处理不同:由于getchar函数每次只读取一个字符,通常需要放在循环中使用,直到读取到结束符号(比如EOF)为止。用途不同:scanf通常用于读取输入流中特定格式的数据,比如读取整数、浮点数、字符串等,可以根据格式字符串指定读取规则。功能不同:scanf函数用于从输入流中读取格式化的输入,可以读取除空格和换行符之外的各种字符。综上所述,scanfgetchar函数读取字符的过程中具有不同的功能和用途,开发者可以根据具体需求选择合适的函数来实现字符输入操作。
探讨getcharscanf区别
ZJRUIII的博客
08-02 8594
前言 说到scanfgetchar,想必大家都不陌生,在学习C语言的第一天起我们就开始接触它们,但我们对它们在输入方面可能有点模棱两可,分不清scanfgetchar真正有什么区别,下面就来分别探讨一下scanfgetchar输入上的特点。 scanf输入上的特点 当我们在运用scanf这个函数需要输入字符串或者数字时,scanf并不是直接从我们的键盘当中直接获取输入的信息,而是从缓冲区中获取信息,这个所谓的缓冲区,是我们在键盘上输入后暂时保存输入信息的地方。当对...
【C语言】常用的输入函数详解——scanf() gets() getchar()
2303_78940834的博客
08-11 1595
写作业经常不知道怎么输入吗?有空格不知道怎么处理吗?只会scanf函数吗?看完这篇文章,你的问题都会解决hhh感觉怎么像江南皮革厂的感觉稍微皮一下,开始今天的分享!scanf()函数用于从标准输入中按照指定格式读取数据。根据占位符的不同,它可以读取不同类型的数据,如整数、浮点数和字符串。scanf()函数根据格式字符串解析输入,并将解析结果存储到相应的变量中。但是,scanf()函数也存在一些问题,如输入缓冲区溢出和格式错误等。gets()函数用于从标准输入读取一行字符串。
【C语言】最通俗易懂地讲解scanfgetsgetchar区别(相信我,看了一定懂!!!)
种树最好的时间是10年前,其次是现在!!!
01-13 7749
〇、写在前面 最近认真钻研了一下,scanfgetsgetchar区别,写一个博客记录一下。 因为博主水平有限,如有疑问,还请口下留情,留言区讨论即可。 一、单字符 1、scanf(%c) 首先要说的是 scanf,它是格式输入函数,标准格式如下: int scanf(const char * restrict format,...); 从 标准输入流(stdin) 中按照说明的格...
scanf gets getchar
03-16
这两个函数的主要区别在于,scanf函数可以读取不同类型的数据,包括整数、浮点数和字符等,而getchar函数仅用于读取单个字符scanf函数的语法如下: ``` scanf("%格式控制符", &变量名); ``` 其中,格式控制符...
C语言中getchar, gets, 和 scanf 三种不同函数区别
最新发布
10-18
在C语言中,getchargetsscanf是三个常见的输入函数,它们各自有着特定的用途和特点。在理解和使用这些函数时,理解它们之间的差异至关重要,以确保代码的安全性和效率。 首先,`getchar()` 函数是用于读取单个...
scanf gets getchar fgets fgetc对回车符号的处理
07-16
2. getsgets函数会将整行输入读取字符串,包括回车符号在内。它会将回车符号存储在字符串中,并在字符串末尾添加一个空字符'\0'。 3. getchargetchar函数会逐个读取字符,包括回车符号。它将回车符号视为普通...
getchar ,gets scanf
fuzekun的博客
01-06 205
getchar 获取字符,接受回车和空格以及Tab gets 获取字符串 ,接受空格和Tab不接受回车 scanf 获取字符串 不接受空格回车或者tab 不接受的会放在缓冲区里面 用 fflush()解决缓冲存留问题 ...
getchar(),getsscanf用法
HYeeee的博客
09-10 786
1、从缓冲区读走一个字符,相当于清除缓冲区 2、前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误。 举例: #include main() { char ch1[10],c
char, char*,scanf,printf
人生如路
03-18 1705
int main() { char c = '\n'; char d = '\0'; char e = 0; char f = '0'; printf("%d\n",c);//10 printf("%d\n",d);//0 printf("%d\n",e);//0 printf("%d\n",f);//48 char *p = new char[10];//ok //char
scanf getchar gets区别
sunlight369的专栏
08-24 969
getchar() 函数也是从键盘上读入一个字符, 并带回显。 它与 前面两个函数区别在于:   //getchar() 函数等待输入直到按回车才结束, 回车前的所有输入字符 都会逐个显示在屏幕上。   // 但只有第一个字符作为
深入了解scanf()/getchar()和gets()等函数
Eye-Opening
12-04 579
深入了解scanf()/getchar()和gets()等函数   ----------------------------------------------------   | 问题描述一:(分析scanf()和getchar()读取字符)   |   ----------------------------------------------------
char类型数据在输入时,用scanf()函数输入时,格式控制串用%c,
weixin_41211961的博客
08-09 3708
输入一个字符,按一次回车 #include<stdio.h> void main() { int i; char ch; for( i=0;i<10;i++ ){ printf("input %d : ", i+1); scanf("%c%*c", &ch ); //用%*c吸收掉回车符。不然,下一次读字符,就会读到这个回车符。 printf("%c:%d\n", ch,...
getchar、printf、scanf
Find的博客
07-22 324
字符输入getchar 原型:int getchar(void); int:表示函数的返回值是int类型 getchar函数名 void:是形参--表示不需要参数 功能:从键盘获取一个字符 返回值:获得的字符的ASCII值 失败:-1 字符的输出:将某一个字符输出到显示屏上 函数原型:int putchar(int c); ...
c语言char用scanf,[求助]使用scanf时,char型的正确输入方法应该是如何?
weixin_42501035的博客
05-19 6606
[求助]使用scanf时,char型的正确输入方法应该是如何?首先是第一段代码#include#includemain(){char c1,c2;scanf("%c,%c",&c1,&c2);printf("c1='%c',c2='%c'\n",c1,c2);system("pause");}建立c1,c2为字符型变量,输入c1,c2的值后输出c1,c2。输入:a,b输出:c1='...
关于string、char * 、scanf()、sscanf()
BatmannLv的博客
11-30 389
1.char*、char[]及string的区别及相互转换 参考: https://www.jb51.net/article/41917.htm https://www.cnblogs.com/fonddream/p/9806810.html 1.1定义 char *s1:s1是一个指向字符串的 指针; char s2[]:s2是一个字符 数组; string s3:s3是一个string类的 对象. string:string是STL当中的一个容器,对其进行了封装,所以操作起来非常方便。 首先必须
写文章

热门文章

  • 等价无穷小公式 212099
  • 线性代数:如何求特征值和特征向量? 188256
  • 求矩阵的伴随矩阵 63948
  • 如何在win10上搭建服务器 63851
  • 测试过程分为哪些阶段 53198

分类专栏

  • C++&STL 33篇
  • Algorithms & Data Structure 14篇
  • Socket网络编程及高并发服务器 19篇
  • 数据库MySQL原理 5篇
  • Ubuntu系统内核分析 9篇
  • OS操作系统编程 5篇
  • 游戏开发 & Unity 81篇
  • CG&OpenGL&Shader 27篇
  • 人机交互 6篇
  • 数学之美 13篇
  • 人工智能Python&OpenCV 33篇
  • Research & 科研之心 17篇
  • 强编程工具 45篇
  • 弱编程类工具 6篇
  • UI开发 QT等 13篇
  • 杂谈 12篇
  • 测试 1篇
  • 设计模式及架构 2篇

最新评论

  • VS查看项目类图

    isabelightL: 博主,请问比较大型的项目是不是无法直接生成类图啊,直接卡死了。

  • virtual box ubuntu鼠标点进去不反应

    2301_79915489: 可是我连点都点不了

  • virtual box ubuntu鼠标点进去不反应

    寒夜筱雪: 无语但感谢表情包

  • 图形学初步------圆生成Bresenham算法

    61438787: 怪我数学不好看不懂

  • Windows下的random_device

    voidvvv: 你使用的是mingw gcc吗?我也遇到了博主一样的问题。 调用std::random_device seedDevice后, 生成的seed都是固定的。

最新文章

  • 前缀++和后缀++相关源码探索
  • LeetCode-二叉树前中后序遍历迭代版
  • C++异常处理
2021年31篇
2020年37篇
2019年218篇
2018年29篇
2017年2篇
2016年13篇
2015年2篇

目录

目录

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keneyr

老爷~给小的赏点盘缠吧555~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家晋中玻璃钢雕塑厂家玻璃钢组合雕塑宁夏玻璃钢雕塑型号玻璃钢花盆能养花吗工艺玻璃钢雕塑供应太湖石玻璃钢彩绘雕塑制作厂家玻璃钢雕塑 设计说明肇庆玻璃钢雕塑制品厂汉南区商场美陈制作最新报价商场艺术美陈堆头铜玻璃钢仿铜雕塑定制玻璃钢魔方雕塑天水户外玻璃钢雕塑淮南玻璃钢景观雕塑厂家呈贡玻璃钢雕塑加工厂家山东佛像玻璃钢雕塑优势文山玻璃钢座椅雕塑报价怀化玻璃钢雕塑设计玻璃钢仿生雕塑哪家服务好广东常见商场美陈销售企业泸州玻璃钢雕塑维修解放玻璃钢雕塑洛阳市玻璃钢雕塑生产厂家绍兴玻璃钢陶瓷雕塑介绍玻璃钢花盆的做法玻璃钢电影动漫雕塑批发厂家景观玻璃钢雕塑铭牌陕西玻璃钢花盆生产深圳商场玻璃钢雕塑公司哪家好贺州玻璃钢雕塑批发定制香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化