黑马程序员技术交流社区

标题: scanf(),getchar() ,gets()使用简单对比 [打印本页]

作者: 綦敦涛    时间: 2015-4-12 20:07
标题: scanf(),getchar() ,gets()使用简单对比



问题一: 使用scanf 和 getchar()函数读取字符
先来看两个简单的程序,用来读字符,并且输出:

#include <stdio.h>int main(){    char ch1,ch2;    scanf("%c",&ch1);    scanf("%c",&ch2);    printf("%d %d\n",ch1,ch2);    //   或者://     char ch3,ch4;//     ch3 = getchar();//     ch4 = getchar();//     printf("%d  %d\n",ch3,ch4);     return 0;}
          程序的本意是从键盘输入两个字符,并打印相应的ASCII码,但是运行后回发现,当输入a回车后并不会提示继续输入第二个字符,而是直接输出 97,10 。
分析:
程序的输入都有一个缓冲区,即输入缓冲区,当由键盘输入是会将输入的内容放入输入缓冲区,c程序直接从输入缓冲区读数据,所以当缓冲区中有残留数据时,程序并不会提示继续输入,而是直接取走缓冲区残留的数据。scanf和getchar读取缓冲区的数据,当输入a并回车后,其实'a'和’\n'都会存入内存缓冲区,所以第一次读取'a'被取走,剩下的‘\n'被第二次取走,输出的10恰好是'\n'的ASCII值。

问题二:使用scanf读取字符串
先看程序:
#include <stdio.h>int main(){    char ch1[20],ch2[20];    scanf("%s",ch1);    printf("%s\n",ch1);        scanf("%s",ch2);    printf("%s\n",ch2);        /*          char *ch3,*ch4;     scanf("%s",ch3);     printf("%s\n",ch3);          scanf("%s",ch4);     printf("%s\n",ch4);     */        return 0;}

分析:
程序功能是读取字符串并输出,这是可以实现的,前提是字符串中间不能有空格或者tab,因为scanf函数是遇到空格、tab、回车停止读取,比说说,我们输入ab  cd,
第一个scanf会去读ab,而cd还在缓冲区中,第二个scanf就会读取cd,而不是要求用户继续输入。
P.S.  虽然定义字符串也可以用指针的方法,但是这里如果用指针定义,程序不会正确执行,原因不清楚。所以我注释的程序是由问题的。

问题三:使用gets()读取字符串
上面的程序,我们把scanf改成gets()来看一下执行结果:
#include <stdio.h>int main(){    char ch1[20],ch2[20];    gets(ch1);    printf("%s\n",ch1);        gets(ch2);    printf("%s\n",ch2);        return 0;//    输入:hello world//    输出:hello world//    输入:world piece//    输出:world piece}
分析:程序结果与scanf显然不同,当输入带有空格的字符串,程序照样会正确读取,所以当我们需要需要带有空格的字符串是,可以选择使用gets()方法;
P.S.   scanf()函数同样可以实现读取带空格的字符串,格式是scanf("%[^'\n']);  (什么意思,不清楚)

总结:
scanf:  以空格、tab、 回车结束一次读取,不会舍弃最后的回车符;
getchar(): 以enter结束输入,也不会舍弃回车符;
get():  以Enter结束,接收空格,舍弃回车符;

避免出现问题:需要清空一下缓冲区的残留数据:
我知道的是rewind(stdin);
使用方法:在第一次读取语句后加rewind(stdin)即可清除上次读取结束后残留的缓冲区数据;



作者: 綦敦涛    时间: 2015-4-12 20:08
:'(,直接从我的博客粘贴过来代码全乱了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2