C语言 提问用puts 输出字符串时会自动加回车么?

有以下程序段
#include <stdio.h>
main()
{ char s[4][10];
int i;
scanf(“%s%s”,s[0],s[1]);gets(s[2]); gets(s[3]);
for(i=0;i<4;i++)
put(s[i]);
}
输入数据如下:aaaa bbbb <CR> (CR代表回车)
cccc dddd <CR> (CR代表回车)
请问输出结果为什么是 aaaa
bbbb
cccc dddd
我个人认为是aaaa
bbbb
cccc
dddd

首先你看懂下面这段文字
scanf函数和getchar函数在输入时是读取到“回车”就结束的,而回车符留在了输入流缓冲区,当下一次输入仍用scanf或者getchar读入一个字符的时候,则会把缓冲区的回车符读取从而导致结果不正确,但若第二次是用scanf输入一个数字的时候,scanf则会跳过空白字符,可以正常输入。
在用scanf读入字符串如scanf("%s",str)时,在输入的过程中,如字符串内有空格如hello world,则只能读取到hello,因为scanf使用%s输入方式时,认为遇到空格、TAB、回车键则认为输入结束,因而只能读取无空格的字符串。
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入,不舍弃最后的回车符。
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!

当你看明白了上面的,再看我给你下面的解释
//----------------------------------------
当程序运行到scanf(“%s%s”,s[0],s[1]);语句时,你输入aaaa bbbb<CR>时,按照上面的,scanf函数在以%s形式输入字符串时遇到空格或回车会结束输入,所以aaaa传给了s[0],然后bbbb传给了s[1],但是最后你输入的这个回车字符不被scanf函数丢弃,留在了输入缓冲区中
然后当程序运行到gets(s[2]);时,会读取到缓冲区中残留的这个回车,而gets函数遇到回车就代表输入结束,所以传给s[2]的是一个空字符串。
然后getss([3]);你输入的cccc dddd就全部传给s[3]了,因为gets函数遇到空格不结束

这样你该明白了吧,还有puts函数输出的时候是自动换行的
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-01-17
会的。
puts声明于头文件stdio.h,其声明格式为
int puts (char *s);
功能为将字符串输出到标准输出终端(stdout)并自动附加换行。

即单行输出字符串s。
从其功能规范上看,puts输出后会自动加回车(换行)的。
第2个回答  2009-03-30
输出时 puts会将字符串'结束标识\0' 转换为 回车
gets 只有遇到换行符时才被结束赋值。 其他whitespace仍会读取
如 Tab 空格
第3个回答  2009-03-30
scanf(“%s%s”,s[0],s[1]);
输入数据:aaaa bbbb <CR>
s[0] 读入 "aaaa"
s[1] 读入 "bbbb"
gets(s[2]); gets(s[3]);
cccc dddd <CR>
s[2] 读入 "cccc dddd <Enter>"
s[3] 没有 读到 实质字符
所以输出:
aaaa
bbbb
cccc dddd
第4个回答  2009-03-30
藏天地 - 江湖新秀 四级说对了,分类名人 L_o_o_n_i_e - 首席执行官 十四级 严重错误,希望挂着什么所谓名人堂标志的用户答题的时候注意点,否则会严重误导读者s[2]得到的是前面aaaa bbbb留下的换行符,而s[3]得到的才是cccc dddd
输出结果是
aaaa
bbbb
空行
cccc dddd

L_o_o_n_i_e - 首席执行官 十四级出现了严重错误,一般网友可以出现这样的错误,而挂着标志还出这样的错误就太丢人了,你自己觉得对得起这个标志么,耻辱啊
相似回答