2 aesun AEsun 于 2014.11.18 18:31 提问

为什么scanf分辨不出空格和空字符,gets()就可以分辨出来

我是新手,刚刚学习字符串,为什么scanf分辨不出空格和空字符,gets()就可以分辨出来,分辨的原理是是什么?比如在scanf中"hello world"就只有“hello",但gets中就是"hello world"?

7个回答

conmajia
conmajia   2014.11.18 18:54
已采纳

对scanf而言,空格属于分隔符,会以空格作为结尾。比如你输入字符串"hello[空格]world[回车]",对scanf而言,它首先找到第一个非空字符"h",然后一直继续到下一个空字符"[空格]"结束,因此scanf得到的是"hello"。gets是以换行(行结束)符作为结束的判定,所以gets会一直读取到"[回车]",得到字符串为"hello world"。

conmajia
conmajia   2014.11.18 18:57

之所以scanf会以空格作为分隔符,是因为它支持单行输入多个变量,比如三个数字1,2,3输入到3个变量a,b,c中,可以用scanf("%d %d %d",&a,&b,&c)这个语句。在运行时,你可以输入"1[回车]2[回车]3[回车]",分3行输入,也可以在同一行里输入"1 2 3[回车]",用空格隔开多个变量。所以就很好理解输入字符串时scanf("%s",&s)只能读取空格前的第一个单词的原因了。

lx624909677
lx624909677   Ds   Rxr 2014.11.18 19:29

不是分辨不出,是scanf吧空格和回车作为输入的结束标示了

YLOIHyl
YLOIHyl   2014.11.18 19:54

scanf()函数以空格或换行或EOF(文件结束)作为一个字符串的结尾,你可以用scanf("%s %s",cstring1,cstring2); 来读取"hello world"字符串。

YoerShine
YoerShine   2014.11.18 23:00
u010002704
u010002704   2014.11.19 00:06

空格也是输入结束的标志,你可以用"%s %s"来获取两个中间有空格的字符串,而gets()封装的是以回车或EOF为输入结束标志,它把空格作为字符串的一部分,,,你可以查看一下gets()的实现,,

eagleyan
eagleyan   Rxr 2014.12.01 08:05

采纳的答案是错误的!!!!
这和scanf没有关系,和你的格式有关系,你使用 %s读取字符,man page显示%s只匹配非空白字符啊。

s Matches a sequence of non-white-space characters; the next pointer must be a pointer to char, and the array must be
large enough to accept all the sequence and the terminating NUL character. The input string stops at white space
or at the maximum field width, whichever occurs first.

你用%100c是可以匹配空白的

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!