问题描述
- 为什么scanf分辨不出空格和空字符,gets()就可以分辨出来
-
我是新手,刚刚学习字符串,为什么scanf分辨不出空格和空字符,gets()就可以分辨出来,分辨的原理是是什么?比如在scanf中"hello world"就只有“hello",但gets中就是"hello world"?
解决方案
对scanf而言,空格属于分隔符,会以空格作为结尾。比如你输入字符串"hello[空格]world[回车]",对scanf而言,它首先找到第一个非空字符"h",然后一直继续到下一个空字符"[空格]"结束,因此scanf得到的是"hello"。gets是以换行(行结束)符作为结束的判定,所以gets会一直读取到"[回车]",得到字符串为"hello world"。
解决方案二:
之所以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)只能读取空格前的第一个单词的原因了。
解决方案三:
不是分辨不出,是scanf吧空格和回车作为输入的结束标示了
解决方案四:
scanf()函数以空格或换行或EOF(文件结束)作为一个字符串的结尾,你可以用scanf("%s %s",cstring1,cstring2); 来读取"hello world"字符串。
解决方案六:
空格也是输入结束的标志,你可以用"%s %s"来获取两个中间有空格的字符串,而gets()封装的是以回车或EOF为输入结束标志,它把空格作为字符串的一部分,,,你可以查看一下gets()的实现,,
解决方案七:
采纳的答案是错误的!!!!
这和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是可以匹配空白的