求解一道c语言的题,新手求问

#include<stdio.h>
main()
{
char c1[6],c2[6],c3[6],c4[6];
scanf("%s%s",&c1,&c2);
gets(c3);gets(c4);
puts(c1);puts(c2);puts(c3);puts(c4);
}
输入
111 222(回车)
333 444(回车)

结果是
111
222

333 444

中间的那段空是怎么来的啊??新手求问,我之前试过单独把c3跟c4输出来结果c3是回车符
谁能 讲解下过程,困扰了我好久,
还有,我试过输入
111 222 333(回车)
444(回车)

结果是
111
222
333
444
为什么333前面会有空格????
就在两个问题,小弟分不多,拜托各位大侠了!!!我尽量给分

gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。
因此,两种输入方法中,均有c1为"111",c2为“222”。
111 222(回车) 333 444(回车)这样输入的话,c3获取是第一个回车键,被丢弃,直接加'\0',也就是说为空,而puts输出之后都会换行。c4为“333 444”。建议你把各数组定义大一点,如长度定义为10.

111 222 333(回车) 444(回车)这种形式输入的话,你所疑惑的空格是“222”和“333”之间的空格,也就是说C3=" 333"[注意之前有个空格]。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-18
scanf和gets用法不一样
scanf是遇到空白(包括回车,空格,tab等)结束,gets是遇到回车才结束
比如你输入111 222回车 那么scanf会读入111到第一个 遇到空格停止读,跳过空白直到下一个非空白,也就是2,然后将222读入到第二个变量中,遇到回车 停止读入。此时回车是在缓冲区的,并没有消失。
但是此刻又用gets来读,读入的是缓冲区的回车。因为gets遇到回车就停止了 所以第三个读入的是空(puts本来就自动加回车的),剩下的333 444就读入到第四个变量里了

打字不容易 谢谢采纳追问

话说在定义的时候c3不是定义了长度是6吗,为什么还能把333 444读进去

追答

能不能读进去跟定义的长度没多大关系。还是函数的功能为首要位置。
就好象说 一杯水能接500毫升(相当于长度),但是有人说 接水的时候看到来人了就停止接水(相当于函数功能)。所以水不一定能接满。一个道理

本回答被提问者采纳
第2个回答  2014-02-18
首先说一下scanf()、gets()和puts()三个函数的差别吧。
scanf():编译在碰到空格,TAB,回车换行或非法数据时,认为接收该输入数据结束。
gets():编译在碰到换行或EOF时,认为接收该输入数据结束。读取的换行符被转换为null值
puts():输出字符串时要遇到'\0’也就是字符结束符才停止。!!!!注意:puts()在输出字符串后会输出回车符。
第一个问题:c1[6]=“111”,c2[6]=“222”,c3[6]=“”,c4[6]="333 444"

输出过程:c1的值,回车符换行,c2的值,回车符换行,c3的值(这里为null空值,即 没有值),回车符换行,c4的值,回车符换行。
第二个问题:c1[6]=“111”,c2[6]=“222”,c3[6]=“(222和333间的空格)333”,c4[6]="444"
输出过程:c1的值,回车符换行,c2的值,回车符换行,c3的值(这里为null空值,即 没有值),回车符换行,c4的值,回车符换行。

大概就是这样了,也是自己在学习过程中理解的。
第3个回答  2014-02-18
你的这个问题主要是scanf("%s") 和 gets() 不同的读入方式引起的。
scanf("%s") 是读入一个字符串,当遇到无法读入的字符时终止,比如空格,回车等。
而gets()是整行读入 一次会把一行的字符全部读入进去。
当你在输入
111 222(回车)
333 444(回车)
时。
c1 读入的是 "111"
c2 读入的是 "222"
然后还有一个换行符 "换行" 多余
所以c3 读入的是"换行"
c4读入的是 "333 444换行"

你试的第二种情况也是如此 只是把换行变成了空格
推荐你先去自习了解那两种读入字符串的方式
http://baike.baidu.com/link?url=H6RaMGVAI4ML6xzMoc9M2PurM4maGCUfMDY-wdn9nyoQePA5I8GpNzJaX_JWKQmwQUHuYENp6IWoSoefrdMx5_

http://baike.baidu.com/view/1457521.htm追问

在定义的时候c3不是定义了长度是6吗,为什么还能把333 444读进去

追答

因为你输出的方式是puts ,从字符串的开始直到遇到终止符"\0",你用gets读入字符串时从头指针读入一串字符, 你的用法是错的,不过按照计算机的储存原理是可以输出来的。

第4个回答  2014-02-18
这个涉及到标准输入缓冲区(stdin),stdin一般存储键盘按下的键的值。
lz的输入为 111[空格]222[回车]333[空格]444[回车]
scanf函数是以空白符号作为输入项的分隔符的,所以lz的第一个空格被scanf跳过了,
scanf运行完之后,stdin中剩下了:
[换行]333[空格]444[换行]

所以gets函数读取的数据为
[换行]333[空格]444[换行]
故 输出为:
111
222
[换行]
333[空格]444
[换行]

如果lz不想显示那个多余的换行,使用fflush(stdin)即可,该函数定义在stdlib.h中
相似回答