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

来源:百度知道 编辑:UC知道 时间:2024/06/24 15:20:12
有以下程序段
#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函数输出的时候是