
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 ;
} 展开
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 ;
} 展开
5个回答
展开全部
这个是和缓冲区有关的,用户输入的数据是保存在缓冲区的,然后执行:scanf、gets等会从缓冲区读数据。
在执行完scanf之后执行getcha确实接收到了‘\n' ,这是因为scanf只接收了数字,缓冲区还有输入的'\n' ,当调用getchar的时候不需要你再输入它就已经接收到了数据,如果你把if去掉,那gets也不会等待你输入,直接接收缓冲区的回车符。
在执行完scanf后想接收字符类数据就必须把缓冲区清空(flush)或者像这里调用一次getchar,这样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的文件,所有文字会变成一行。
2012-12-19 · 知道合伙人软件行家
关注

展开全部
因为 你在输入数据后会按 键盘上的回车键(是 '\n')
scanf 遇到回车键会结束读取数据,但是不会将 '\n' 从键盘缓冲区读出,便会在键盘缓冲区
如果加 getchar(),便会读出 '\n'
如果没有, 等到gets()读取键盘缓冲区内容是,发现'\n',认为读取结束,便返回,虽未读取任何字符,但是会读出'\n',对于gets()来说,'\n'不是它要读取的内容,便会丢弃!
scanf 遇到回车键会结束读取数据,但是不会将 '\n' 从键盘缓冲区读出,便会在键盘缓冲区
如果加 getchar(),便会读出 '\n'
如果没有, 等到gets()读取键盘缓冲区内容是,发现'\n',认为读取结束,便返回,虽未读取任何字符,但是会读出'\n',对于gets()来说,'\n'不是它要读取的内容,便会丢弃!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问的问题好奇怪,程序既没有return ,exit,也没有堆栈溢出,怎么会失效?
建议你在return 0;之前加一句printf("main end.\n");你就知道程序没有失效了。
另外关于\r还是\n,系统会自动帮你转换成\n,按照你这个程序的写法你只需要在程序里面判断\n就可以了,多余你不用考虑。
建议你在return 0;之前加一句printf("main end.\n");你就知道程序没有失效了。
另外关于\r还是\n,系统会自动帮你转换成\n,按照你这个程序的写法你只需要在程序里面判断\n就可以了,多余你不用考虑。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
原因是在这两个函数上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流中读取数据,而是读取用户即时输入数据.
而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流中读取数据,而是读取用户即时输入数据.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C语言中用“printf”输出时,换行符是'\n',回车符是'\r'。
C语言中用“scanf”获取输入值时,获取的“敲键盘回车键产生的字符”是换行符。
你把if语句去掉之后,“gets(name) ;puts(name) ;”这两句语句没有失效,而是把换行符获取、输出了。由于你没有在这两句语句后面放置暂停语句,这两句语句把换行符获取、输出后程序直接结束了,没有让你看到效果,所以你认为这两句语句失效了。
C语言中用“scanf”获取输入值时,获取的“敲键盘回车键产生的字符”是换行符。
你把if语句去掉之后,“gets(name) ;puts(name) ;”这两句语句没有失效,而是把换行符获取、输出了。由于你没有在这两句语句后面放置暂停语句,这两句语句把换行符获取、输出后程序直接结束了,没有让你看到效果,所以你认为这两句语句失效了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询