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

问题描述

为什么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"字符串。

解决方案五:

http://wenku.baidu.com/link?url=WdmYbmsnuYirrCFpVgBdYcInkwOQqsROqPq08Q7JWoe8ds3_7lXJyfYD8kUgb5VUvfjwl-J7u3P-M8uXG_V3EsjQnWNQGUkON9gIjTT6WP7

解决方案六:

空格也是输入结束的标志,你可以用"%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是可以匹配空白的

时间: 2024-12-23 04:30:33

c语言-为什么scanf分辨不出空格和空字符,gets()就可以分辨出来的相关文章

c语言的scanf在按下“Enter”键后到底发生了什么事情??

问题描述 c语言的scanf在按下"Enter"键后到底发生了什么事情?? 我有几个问题: 上面的解释是输入71.82后按下回车,回车被c1当作字符吸收了,c2吸收了'A';但是上面输入完b=7后,不是按下了回车键吗,最终输入了71.82按下回车后,键盘缓存中不是存留着两个回车吗?为什么c2不是吸收到回车?? scanf在按下"Enter"键后到底发生了什么事情? 解决方案 执行scanf()函数时,在键盘输入回车会把之前的输入连同回车符一起送入缓存区,然后通过格式

printf-c语言去除控制台输入字符串的空格

问题描述 c语言去除控制台输入字符串的空格 #include void f(char *); int main(void) { char str[100]; scanf("%s", str); f(str); return 0; } void f(char *str) { char str1[100]; int i = 0, j = 0; while(str[i] != '') { if(str[i] != ' ') { str1[j] = str[i]; j++; } i++; }

字符串-[c语言]关于 scanf() 和 char数组 的小实验的问题

问题描述 [c语言]关于 scanf() 和 char数组 的小实验的问题 写了三个小的几乎一样的test代码,但是输出却不同,不明白为什么,求大神指点.全部代码如下:#include void sub1(void); int main(){ /*test1*/ sub1(); /*test2 */char w0[2]={'a''a'}; char * pc0 = w0; printf("" w1 = %s""w0); /*wrong*/printf("&

c语言-怎样解决C语言TXT文本输入数据时的空格问题?

问题描述 怎样解决C语言TXT文本输入数据时的空格问题? 题目如下: 1到40,一共四十个数,输入时一行不超过12个数,不超过10行,筛选出现一次的数字,出现两次的数字,三次及三次以上的数字,出现零次的数字,要求用TXT文本输入,输出.遇到的问题:输入数据后,发现结果错误.仔细查找发现,每行数据后会发现几个空格,,导致了只有第一行数据能够读入.笔者试过多次,发现貌似只有这一种空格形式会对结果造成影响,其他的情况,添加很多空格也不会有事.笔者咨询前辈,说可能由于中文或者英文状态下的原因,笔者试过两

c语言关于scanf("%*s")

问题描述 c语言关于scanf("%*s") 我只想scanf(""%*s"")该语句起清除作用,并不想在运行时,额外要多输入字符,请问如何解决呢? #include void rt ( char ch int x int y); //声明调用函数int main (void){ int i j status; char ch; printf (""请输入一个字符:n"");scanf ("&qu

c++基础-1.c++中打印出空格2.数组赋值

问题描述 1.c++中打印出空格2.数组赋值 1.c++中怎么打印出空格? 2.a[2][3]数组赋值问题:如给数组元素a[0][0]赋值好之后怎样能让键盘输入的值在同一行上 解决方案 (1) cout << " " (2) 检查你的代码中有没有n或者endl之类的换行,去掉它们 解决方案二: 1.cout<<" "; 2.不加回车符换行符的endl就在同一行了, 解决方案三: 直接cout<<" "就可以输出

c语言-用VS6编写C语言,编译时弹出这个文件不存在是怎么回事?怎样解决?

问题描述 用VS6编写C语言,编译时弹出这个文件不存在是怎么回事?怎样解决? 用VS6编写C语言,编译时弹出这个文件不存在是怎么回事?怎样解决? 解决方案 安装完整版本的VC++ 6.0,新建一个项目,把你原来的项目的代码复制粘贴到新的项目,再编译. 原版的VC++下载:http://download.csdn.net/album/detail/639 (我亲自上传,并且不要任何积分)

指针-新手OJ,C语言 去除字符串中的所有空格模块, 不知为何出错,求大神指点

问题描述 新手OJ,C语言 去除字符串中的所有空格模块, 不知为何出错,求大神指点 作用: 把数组a中的所有空格去除, 并把后面的往前移动.例如: a b c变成:abc 字符指针 *p *q 数组a[] for(p=&a[0]; p!=''; p++)if(*p==' ')for(q=p; *(q+1)!=''; q++)*q=(q+1); //去除a字符串中的空格 但总是不对, 求大神指点. 解决方案 #include<stdio.h>int main(){ char str[20

c语言-C语言用scanf清理输入缓存的一个程序

问题描述 C语言用scanf清理输入缓存的一个程序 源程序如下:#includeint main(){ int num; printf(""输入数字:""); scanf(""%d""&num); printf(""输入了数字:%dn""num); printf(""是否继续测试:[Y/N]"");scanf(""%*[