scanf函数返回值空格问题

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
---------------------------------------------------- | 问题描述一:(scanf()读入字符串中的空格)&&
| ---------------------------------------------------- #include&stdio.h& int main() {
char a[777];
scanf("%[^\n]",&a);
printf("%s",a);
return 0; }
说明: 在scanf函数中,可以使用 %c来读取一个字符,使用 %s 读取一个字符串,但 是读取字符串时不忽略空格,读字符串时忽略开始的空格,并且读到空格为止,因此只能读取一个单词,而不是整行字符串,因此一般使用fgets来读取一个字符串。其实scanf函数也可完成这样的功能,而且还更强大。这里主要介绍一个参数,%[ ],这个参数的意义是读入一个字符集合。[ ]是个集合的标志,因此%[ ]特指读入此集合所限定的那些字符, 比如 %[A-Z] 是输入大写字母,一旦遇到不在此集合的字符便停止。如果集合的第一个字符是" ^ ", 这说明读取不在" ^ " 后面集合的字符,既遇到" ^ " 后面集合的字符便停止.注意此时读入的字符串是可以含有空格的。
---------------------------------------------------- | 问题描述二:(分析scanf()和getchar()读取字符)&&
| ---------------------------------------------------- &&&
scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1: &&&
#include &stdio.h& &&&
int main() &&&
{ char ch1, ch2; scanf("%c", &ch1);
scanf("%c", &ch2); printf("%d %d\n", ch1, ch2); return 0; &&&
或者是: &&&
#include &stdio.h& &&&
int main() &&&
{ char ch1, ch2; ch1 = getchar(); ch2 = getchar(); printf("%d %d\n", ch1, ch2); return 0; &&&
程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。可是执行程序后会发现除了问题:当从键盘输入一个字符后,就打印出了结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符'a', 打印结果是97,10。这是为什么呢? 【分析】: &&&
首先我们呢看一下输入操作的原理, 程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的, 当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入, 这就是例子中为什么会出现输入语句失效的原因!
其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符\n,这样第二次的读入函数直接从缓冲区中把\n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因! ---------------------------------------------------- | 问题描述二:(分析scanf()和gets()读取字符串)&&
| ---------------------------------------------------- 首先我们看一下scanf()读取字符串的问题: 程序2: &&&
#include &stdio.h& &&&
int main() &&&
{ 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 world!后,字符串Hello world!都会被读到输入缓冲区中,而scanf()函数取数据是遇到回车、空格、TAB就会停止,也就是第一个scanf()会取出"Hello",而"world!"还在缓冲区中,这样第二个scanf会直接取出这些数据,而不会等待从终端输入。 测试二: Hello[Enter]
Hello[输出] world[Enter] world[输出] 【分析】程序执行了两次从键盘读入字符串,说明第一次输入结束时的回车符被丢弃!即:scanf()读取字符串会舍弃最后的回车符!
我们再看一下gets()读取字符串的情况: 用scanf来读取一个字符串时,字符串中是不可以出现空格的,一旦出现空格,后面的数据就会舍弃残留在缓冲区中。其实有另外一个函数是可以接受空格的,那就是gets(),下面我们看一下这个函数的应用,我们把程序2改动一下: 程序3: #include &stdio.h& int main() { char str1[20], str2[20]; gets(str1);
printf("%s\n",str1);&&&
gets(str2);
printf("%s\n",str2);
return 0; } 测试: Hello world! [输入] Hello world! [输出] 12345 [输入] 12345 [输出] 【分析】显然与上一个程序的执行情况不同,这次程序执行了两次从键盘的读入,而且第一个字符串取了Hello world! 接受了空格符,而没有像上一个程序那样分成了两个字符串!所以如果要读入一个带空格符的字符串时因该用gets(), 而不宜用scanf()!
为了您的安全,请只打开来源可靠的网址&&&&
阅读(571)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'C语言scanf函数与空格',
blogAbstract:'C语言scanf函数与空格
---------------------------------------------------- | 问题描述一:(scanf()读入字符串中的空格)&&
| ---------------------------------------------------- #include&stdio.h& int main() {
char a[777];
scanf(\"%[^\\n]\",&a);
printf(\"%s\",a);
return 0; }
blogTag:'c语言scanf函数与空格',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:1,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'-1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}scanf问题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
4页免费86页免费43页免费6页免费5页免费 2页免费8页2下载券5页免费2页免费
喜欢此文档的还喜欢6页免费2页免费52页1下载券4页免费12页免费
scanf问题|s​c​a​n​f​函​数​输​入​遇​到​的​问​题​,​错​误
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢关于scanf中%n的计数原理问题
[问题点数:40分,结帖人peter1993819]
关于scanf中%n的计数原理问题
[问题点数:40分,结帖人peter1993819]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2012年 总版技术专家分年内排行榜第七
2014年12月 总版技术专家分月排行榜第一
2012年 总版技术专家分年内排行榜第七
2014年12月 总版技术专家分月排行榜第一
2012年 总版技术专家分年内排行榜第七
2014年12月 总版技术专家分月排行榜第一
2012年 总版技术专家分年内排行榜第七
2014年12月 总版技术专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助探讨scanf函数的常见问题 日   经常错的几个地方:(xpsp2,vc6 0环..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
探讨scanf函数的常见问题
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 scanf函数返回值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信