C语言换行符和回车符的疑问
发布网友
发布时间:2022-05-20 06:26
我来回答
共5个回答
热心网友
时间:2023-10-26 13:36
这个是和缓冲区有关的,用户输入的数据是保存在缓冲区的,然后执行: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的文件,所有文字会变成一行。
热心网友
时间:2023-10-26 13:37
因为 你在输入数据后会按 键盘上的回车键(是 '\n')
scanf 遇到回车键会结束读取数据,但是不会将 '\n' 从键盘缓冲区读出,便会在键盘缓冲区
如果加 getchar(),便会读出 '\n'
如果没有, 等到gets()读取键盘缓冲区内容是,发现'\n',认为读取结束,便返回,虽未读取任何字符,但是会读出'\n',对于gets()来说,'\n'不是它要读取的内容,便会丢弃!
热心网友
时间:2023-10-26 13:37
问的问题好奇怪,程序既没有return ,exit,也没有堆栈溢出,怎么会失效?
建议你在return 0;之前加一句printf("main end.\n");你就知道程序没有失效了。
另外关于\r还是\n,系统会自动帮你转换成\n,按照你这个程序的写法你只需要在程序里面判断\n就可以了,多余你不用考虑。
热心网友
时间:2023-10-26 13:38
原因是在这两个函数上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流中读取数据,而是读取用户即时输入数据.
热心网友
时间:2023-10-26 13:38
C语言中用“printf”输出时,换行符是'\n',回车符是'\r'。
C语言中用“scanf”获取输入值时,获取的“敲键盘回车键产生的字符”是换行符。
你把if语句去掉之后,“gets(name) ;puts(name) ;”这两句语句没有失效,而是把换行符获取、输出了。由于你没有在这两句语句后面放置暂停语句,这两句语句把换行符获取、输出后程序直接结束了,没有让你看到效果,所以你认为这两句语句失效了。