scanf("%s")和scanf("%c")区别

来源:互联网 发布:淘宝上如何卖二手货 编辑:程序博客网 时间:2024/04/19 21:06

今天做了道题,涉及到字符串、字符、数字的读取问题,感觉自己对于scanf("%s") 和scanf("%c")的区别还不是很清楚,以前都是一边写,一边测,也没注意过它们的区别,今天感觉被坑的较惨,所以写下这篇博文。


读入格式:%s、%c、%d……

它们各自的分隔符:

%s:空格、回车、TAB键

%d:空格、回车、TAB键

%c:没有分隔符,上述分隔符都被它当作正常字符对待。


以下内容摘自:http://blog.csdn.net/liuhui_8989/article/details/13398793

首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf,getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取)。另外特别注意键盘上敲入回车实际为“\r\n”,但存储到缓冲区时候会舍弃‘\r’而只存储\n.例如我们敲入字符“12345回车”,缓冲区内存储的为“12345\n”.

文章中“_”代表空格

代码:

char *s;

scanf("%s",s);

printf("%s\n",s);

scanf("%s",s);

printf("%s\n",s);


事例1:

输入:123_345回车            “_”代表空格

输出:123

           345

原因:对于scanf以%s格式输入时候,“空格、换行符、TAB”等是作为两个数据的分隔符存在的,即分隔符前后是两个数据,读入时候分隔符不读入。


事例2:

输入:123回车

        456回车

输出:123

           456

原因:如事例1,输入123回车后,缓冲区内存的是123\n,第一次读入后,缓冲区内只剩余了\n,当第二次读入时候,\n是以分隔符存在的,不读入第二次的是,故缓冲区中是没有数据存在的,所以需要继续输入数据。


事例3:

输入:_回车                     “_”代表空格

这种输入会要求一直输入,这是因为空格和\n都是分隔符,没有数据,所以没办法读入。同样直接输入回车也是一直要求输入


代码:

char *s;

scanf("%s",s);

printf("%s\n",s);

scanf("%c",s);

printf("%d\n",*s);


事例1:

输入:1234_12回车                     “_”代表空格

输出:1234

    32(空格的ASCII为32)

原因:对于第一个%s读入时遇到分隔符“空格”就停止,但是空格还是保存在缓冲区的。对于%c读入时候,“空格、\n、TAB”等是正常字符,所以第二次读入时候读取缓冲中的第一个字符“空格”,所以输出的是32.


事例2:

输入:123回车

输出:123

           10(\n的ASCII为10)

原因:%s读入后缓冲中指剩下了\n故第二次以%c读入时候就读入了\n,输出为10.

回收处理这种额外的字符,通过getchar()即可。

当输入为:变量,变量

可以这样scanf("%d,%d"); scanf("%c,%c");

如果上述逗号为空格,响应变为scanf("%d %d");即可。



0 0
原创粉丝点击