| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1351 人关注过本帖
标题:关于scanf的问题-。
只看楼主 加入收藏
洛云
Rank: 5Rank: 5
等 级:职业侠客
帖 子:204
专家分:356
注 册:2010-2-3
收藏
得分:2 
回复 10楼 pcbaichi
还有这种用法?长见识了。
不过不知能否讲解一下,看不明白

QQ群:C语言初级群:31066229
   JAVA2自学交流群(筹备中):31066388
UC群:C语言学习:10051714
2011-02-18 17:56
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:2 
我在这里把scanf()格式化输入的内部过程给大家尽量细腻地描述一下,希望对初学者有帮助:
scanf()无论内部的格式符是什么,也无论有几个格式符(就是所谓的"%某"),对于每个格式符,都按如下过程进行:
其实现将从键盘输入的数据赋值给参数所指向的空间,而解释方式取决于格式符。
如果一开始输入的是空格字符或者\t或者\n,这三种字符都会被“忽略”,scanf()将不理睬这些字符,但会将这些字符从键盘缓冲区清除掉;
直到输入非空格字符(上面所述的3种符号),scanf()会认为“数据开始了”,并将其暂存起来,而且将其从键盘缓冲区中清除掉;
当再次遇到空格字符,scanf()将认为“当前的数据输入完成”了,而且要命的是:scanf()会将这个空格字符“回退”到键盘缓冲区中。
以上就完成了一次格式符数据的输入过程,同样的过程会在下个格式符中重复!
如果在scanf()后执行gets()函数,那么,scanf()所接受的最后一个\n,必然是\n,会被gets()函数直接接受,而完成字符串的输入!
这就是最要命的地方!
建议在gets()前用“清空键盘缓冲区”的函数(比如flush())先清空scanf()所遗留的\n字符。

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-02-18 18:07
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
这样的基本功,初学者一定要仔细掌握。
强烈建议斑竹把这个贴置为精华。谢谢斑竹。

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-02-18 19:16
xihabang
Rank: 2
等 级:论坛游民
威 望:1
帖 子:19
专家分:49
注 册:2010-12-5
收藏
得分:2 
回复 10楼 pcbaichi
请问 [] 这是正则的写法 ?
2011-02-18 19:59
VT_TV
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-2-18
收藏
得分:0 
再细化一下我的问题吧- -就是说。我让用户输入一段string然后但是我无法控制用户输入的string里面是不是有空格。如果有的话,我的程序有时候就会crash要不然就是没有记录空格后面的东西。
我试过第十楼的办法。- -但是还是没有记录空格后的值。也不知道为啥么- -
2011-02-19 09:26
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:0 
回复 15楼 VT_TV
发你的源代码吧

免费赠送河蟹一只
2011-02-20 22:15
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
楼主,还是建议你不要继续了。scanf()内部的问题,我们在外部是无法彻底解决的,就算能解决一个空格符号,但两个能?多个呢?
还是用gets(),然后用类似atoi()这样的函数实现类型的转换,再不行,大不了自己编写函数,自己将字符串转换成其他类型不就得了?
能想来楼主现在因功能要求的复杂化,与C语言功能的低级化之间矛盾ing!理解!赫赫

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-02-20 22:33
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:0 
的确,这才是正解,顶

免费赠送河蟹一只
2011-02-20 22:35
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:2 
以下是引用VT_TV在2011-2-19 09:26:39的发言:

再细化一下我的问题吧- -就是说。我让用户输入一段string然后但是我无法控制用户输入的string里面是不是有空格。如果有的话,我的程序有时候就会crash要不然就是没有记录空格后面的东西。
我试过第十楼的办法。- -但是还是没有记录空格后的值。也不知道为啥么- -
问题过于模糊我无法确切解答,但是我感觉你的问题不是在scanf上。你是不是char *s;然后把s当成了一个字符串在用?如果是的话你应该换一本好教材然后好好看书。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-02-20 22:39
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
以下是引用犬虫门心在2011-2-20 22:33:10的发言:

楼主,还是建议你不要继续了。scanf()内部的问题,我们在外部是无法彻底解决的,就算能解决一个空格符号,但两个能?多个呢?
还是用gets(),然后用类似atoi()这样的函数实现类型的转换,再不行,大不了自己编写函数,自己将字符串转换成其他类型不就得了?
能想来楼主现在因功能要求的复杂化,与C语言功能的低级化之间矛盾ing!理解!赫赫
非常建议你好好看看scanf的用法然后再回复这类问题。
一定程度上你的回复(对gets()和scanf()的分析)是完全错误的。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-02-20 22:42
快速回复:关于scanf的问题-。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046981 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved