c语言问题,12年3月真题

有以下函数
#include <sthio.h>
main()
{ char a[20],b[20],c[20];
scanf(”%s%s”,a,b);
gets(c);
printf(”%s%s\n”,a,b,c);
}
程序运行时从第一行开始输入 this is a cat!<回车>,则输出结果是
A thisisacat! B this is a C thisis a cat! D thisisa cat!
我认为 ,当遇到第一个空格,算是把This给了a,遇到第二个空格算是把is给了b,最后把a cat!给了c,输出应该是thisisa cat!请问为什么输出时以ab c的形式输出,答案为C,求详解

第一,应该是

printf("%s%s%s\n",a,b,c);

才有答案

第二,数组c中的内容应该是" a cat!",注意a的前面有一个空格,gets可以接收空格的,而scanf中的%s不接收空格

追问

不好意思,这是复制过来的,请看一下 刘文正粉丝 的回答中,我的问题 ,谢谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-31

scanf() 接收字符串时候,可以理解为按照位来接收,

比如:是字符串abc d,接收当前a时候判断b是否是空格

要是b不是空格,则移动到b,在判断b的下一位c

是不是空格,依然不是,移动到c,在判断

c的下一位是不是空格,是。则表示c和c之前的属于

同一个字符串。这时候,注意也就是说,

判断结束时候,还是有个空格的。

#include <stdio.h>
void main()
{
char a[20],b[20],c[20];
scanf("%s%s",a,b);
getchar();//接收下一个字符
gets(c);
printf("%s%s%s\n",a,b,c);
}

可以使用该函数验证,输入this is a cat!

scanf("%s%s",a,b); //接收了this,空格处理,is,

getchar();//接收了空格;

gets(c);接收了a cat!

追问

你意思是空格也包含第一个字符串里了?那答案不成b了?

追答

你看看我的分析
输入this is a cat!
scanf("%s%s",a,b); //接收了this,空格处理作为判断下个字符要开始的条件一直到非空格作为下个字符开始,is,

getchar();//接收了空格;
gets(c);接收了a cat!
你可以是用this is a cat!
验证

第2个回答  推荐于2016-07-11
scanf函数有个特性,当读取多个数据时,由%组成的控制符之间可以留置空格,也可以不留置空格,作用都一样:允许用空格分隔数据。比如,scanf(”%s%s”,a,b);和scanf(”%s %s”,a,b);效果一样;输入时可以输入一个字符串回一次车,也可以一次输入中间用空格隔开的两个字符串。实际上scanf在遇到空格时认为前面的输入有效并结束,而如果紧接着还是scanf语句,那就读取这个空格但不赋给任何变量,接着读取后面的输入数据;如果跟着的是别的输入语句,那就要看这别的输入语句有什么特性,按这别的输入语句的特性处理这个空格。在你这里输入this is a cat!<回车>后,this赋给了a,空格留在缓冲区,接着还是scanf接收第二个数据is,就先读取上次留下的空格,但不赋给任何变量,接着读is并赋给b;后面不再是scanf了,那么is后的空格就一直留在缓冲区。后面是用get读取,它是接收空格的……所以刚好所得结果是C项。(题中最后的printf(”%s%s\n”,a,b,c);少了个%s)追问

is后的空格是在缓冲区,gets也能读取吗?还有,如果就没有c数组,printf(“%s%s\n”,a,b),结果是thisis还是this空格is空格,还是thisis空格

追答

gets是接收空格的!无论这个空格在开头,在中间或是在末尾。
printf(“%s%s\n”,a,b)的输出结果是thisis,前后都没有空格。

本回答被提问者采纳
第3个回答  2014-08-31
给的答案错了,应该输出的是thisis\n追问

那如果这道题中把b.c都去掉,只有a一个数组,然后输入this〈空格〉它会输出this吗?空格又存到哪了,没有另外的空间那?

追答

我去,我看错了.你写代码写得好多错误.答案是对的.第一个%S收到的字符是:this(后面的空格还在内存中)第二个是is(is后的空格在内存中,但is前的空格已被吸收了)然后一个gets把is后的那个空格到\n(不包括)都存到c里了也就是说:
A:this
B:is
C: a cat!

追问

你意思是由于后面出现的gets,把它前面的空格本来是在b里的,移到了c里?

还有,第一个空格既然在内存中,为什么输出的时候不输出

相似回答