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

其实这些函数的具体应用和区别应该早就清楚了—-
= =··· 但是鄙人实在是很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++具有特色的的输入输出函数的具体应用,下个博客再记。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

keneyr

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

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

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

打赏作者

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

抵扣说明:

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

余额充值