C语言换行符和回车符的疑问

请问scanf输入结束敲键盘回车键,产生的到底是什么字符?C语言中换行符是'\n',回车符是'\r'但是下面程序运行到if语句的时候,会输出它附属的语句,这就说明遇到了换... 请问scanf输入结束敲键盘回车键,产生的到底是什么字符?
C语言中换行符是'\n',回车符是'\r'
但是下面程序运行到if语句的时候,会输出它附属的语句,这就说明遇到了换行符。
但如果把if语句去掉的话,下面的所有语句都失效了,这就说明遇到了gets接受到了回车符并丢弃了,请问这是怎么回事? scanf结束后产生的字符到底是回车符还是换行符?

#include <stdio.h>
#define LEN 10
int main (void)
{
int i ;
char name[LEN], ch ;
printf("请输入一个数字:") ;
scanf("%d",&i) ;
if ( ( ch = getchar() ) == '\n' )
printf("是换行符\n") ;
gets(name) ;
puts(name) ;
return 0 ;
}
展开
 我来答
瀚漠
推荐于2017-09-24 · 专注C语言发开,Linux系统相关
瀚漠
采纳数:309 获赞数:1289

向TA提问 私信TA
展开全部
这个是和缓冲区有关的,用户输入的数据是保存在缓冲区的,然后执行:scanf、gets等会从缓冲区读数据。
在执行完scanf之后执行getcha确实接收到了‘\n' ,这是因为scanf只接收了数字,缓冲区还有输入的'\n' ,当调用getchar的时候不需要你再输入它就已经接收到了数据,如果你把if去掉,那gets也不会等待你输入,直接接收缓冲区的回车符。
在执行完scanf后想接收字符类数据就必须把缓冲区清空(flush)或者像这里调用一次getchar,这样gets函数才能顺利执行。

不知道我这样讲你能不能明白,还有疑问可以接着问......
追问
谢谢,解决了一些问题,但还有个疑问,如果scanf输入完毕敲了回车后产生的是\n,那\r 这个“回车符”要怎么才会产生?它的作用又是什么?
追答
C语言中:
\r 是转义字符,你在用:
printf("abcd\rfd\n");
输出时就知道\r的作用了(定位光标到行首),输出结果:fdcd(先输出abcd,\r把光标定位到行首,输出fd会把原来的ab掩盖掉)

C语言中enter代表的\n,所以用enter是产生不了 \r 符的
在操作系统中enter就不同了:
PC/DOS Enter -> \r\n
苹果 Enter -> \r
UNIX Enter -> \n
这也是为什么系统之间的文件不兼容的一点原因,用windows处理UNIX的文件,所有文字会变成一行。
lgao622
2012-12-19 · 知道合伙人软件行家
lgao622
知道合伙人软件行家
采纳数:1137 获赞数:6550
毕业于武汉工程大学邮电与信息工程学院通信专业,软件行业,4年工作经验。

向TA提问 私信TA
展开全部
因为 你在输入数据后会按 键盘上的回车键(是 '\n')
scanf 遇到回车键会结束读取数据,但是不会将 '\n' 从键盘缓冲区读出,便会在键盘缓冲区

如果加 getchar(),便会读出 '\n'
如果没有, 等到gets()读取键盘缓冲区内容是,发现'\n',认为读取结束,便返回,虽未读取任何字符,但是会读出'\n',对于gets()来说,'\n'不是它要读取的内容,便会丢弃!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
clitoriscn
2012-12-19 · TA获得超过3628个赞
知道小有建树答主
回答量:3258
采纳率:0%
帮助的人:1564万
展开全部
问的问题好奇怪,程序既没有return ,exit,也没有堆栈溢出,怎么会失效?

建议你在return 0;之前加一句printf("main end.\n");你就知道程序没有失效了。

另外关于\r还是\n,系统会自动帮你转换成\n,按照你这个程序的写法你只需要在程序里面判断\n就可以了,多余你不用考虑。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jackal56
2012-12-19 · TA获得超过304个赞
知道小有建树答主
回答量:279
采纳率:0%
帮助的人:278万
展开全部
原因是在这两个函数上getch()和scanf()上.'\n'和'r'其实都是回车键产生的字符.只是scanf()或getchar()遇到回车键就会获得'\n'
而getch()遇到回车就得到'\r',为了检验我所说.写了程序检验:
main()
{
char a;
scanf("%c",&a);
printf("%d",a);
getch();
}
/*结果是10,也就是'\n'*/
main()
{
char a;
a=getch();
printf("%d",a);
getch();
}
/*结果是13,就是'\r'*/
造这个的原因是stdin流.因为getch()不从stdin流中读取数据,而是读取用户即时输入数据.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
数学之星
2012-12-19 · TA获得超过451个赞
知道小有建树答主
回答量:230
采纳率:0%
帮助的人:145万
展开全部
C语言中用“printf”输出时,换行符是'\n',回车符是'\r'。
C语言中用“scanf”获取输入值时,获取的“敲键盘回车键产生的字符”是换行符。
你把if语句去掉之后,“gets(name) ;puts(name) ;”这两句语句没有失效,而是把换行符获取、输出了。由于你没有在这两句语句后面放置暂停语句,这两句语句把换行符获取、输出后程序直接结束了,没有让你看到效果,所以你认为这两句语句失效了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式