while(getchar()!='\n');为什么能清除回车

iverson8866 2010-06-10 07:55:06
书上说在scanf语句后加一句while(getchar()!='\n');可以清除回车符,谁能帮我说一下原理啊,谢谢!
...全文
1276 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
匚匚 2010-06-10
  • 打赏
  • 举报
回复
http://stdcpp.cn/html/3/3/0510/6.htm
匚匚 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xu044 的回复:]
rewind也是不行的,如果不把非法输入读出,那就总是停留在输入缓冲区的开始处,下次读入操作依然从此入开始,所以还是while(getchar()!='\n')比较有效!
[/Quote]
fseek(stdin,0L,2);//???
xu044 2010-06-10
  • 打赏
  • 举报
回复
rewind也是不行的,如果不把非法输入读出,那就总是停留在输入缓冲区的开始处,下次读入操作依然从此入开始,所以还是while(getchar()!='\n')比较有效!
xu044 2010-06-10
  • 打赏
  • 举报
回复
while(getchar()!='\n')不只是清除回车,还能清除所有剩下的不符合输入条件的内容,这样就不会影响下次的输入了。

比如scanf("%d", &n) 你不小心输入了89ab\n,
这时只在后面加一个getchar()是不行的,如果使用while(getchar()!='\n')就可以清除回车前的所有非法输入

同意8楼,fflush只对stdout做了明确定义,对stdin的操作是不确定的,执行结果依赖于实现。
wade_2003 2010-06-10
  • 打赏
  • 举报
回复
LZ你晕了没有?是不是还是不知道该用哪一个
匚匚 2010-06-10
  • 打赏
  • 举报
回复
4樓和6樓的如下說法是有問題的:

fflush(stdin); //依赖于具体实现

建议用:

rewind(stdin);

赵4老师 2010-06-10
  • 打赏
  • 举报
回复
while(getchar()!='\n');
等价于
while (1) {
if (getchar()=='\n') break;
}
zhangweiit 2010-06-10
  • 打赏
  • 举报
回复
scanf语句后加一句while(getchar()!='\n');可以清除回车符,

我试过,会有这个效果
但是,不用while(getchar()!='\n');,只用一句getchar();也会有这个效果

while(getchar()!='\n')本质上也就是调用 了getchar()一次

不过这偶尔会有问题,建议还是用fflush(stdin)
pengzhixi 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 iverson8866 的回复:]
书上说在scanf语句后加一句while(getchar()!='\n');可以清除回车符,谁能帮我说一下原理啊,谢谢!
[/Quote]

回车被当成是一种换行符了
cattycat 2010-06-10
  • 打赏
  • 举报
回复
确实如1楼所说,真清除缓冲的回车符号,用fflush(stdin)就可以了。
wzywsk 2010-06-10
  • 打赏
  • 举报
回复
估计是scanf后面还有一个scanf的话回车符会被第二个scanf接收,while(getchar()!='\n')在某种意义上可以接收回车符
z569362161 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 thefirstz 的回复:]
这个不是清除回车符,只是当按键是回车的时候不进入while循环,相当于某种意义上的清除回车
[/Quote]
while(getchar()!='\n');当输入'\n'回车时,循环条件为假,结束循环。
昵称很不好取 2010-06-10
  • 打赏
  • 举报
回复
这个不是清除回车符,只是当按键是回车的时候不进入while循环,相当于某种意义上的清除回车
东莞某某某 2010-06-10
  • 打赏
  • 举报
回复
缓冲区接受键盘发送的字符,getchar顺序取缓冲区字符,对于getchar())!='\n'

当然是先取出'\n'才判断了!自然也就是所谓的清除回车符
xu044 2010-06-10
  • 打赏
  • 举报
回复
回车符当然也清除了,如果读取不到回车循环就继续,直到读取到回车才终止循环,你说清除了回车符没?
和下面的写法是一样的

while(getchar()!='\n')
; //输入不是回车就执行空语句,然后继续循环,遇到回车循环终止

while(getchar()!='\n')
continue;

[Quote=引用 15 楼 iverson8866 的回复:]
我主要是想问一下那个最后输入的回车符是不是也被清除了,为什么?这句代码是当输入不是换行符的时候就跳过什么都不执行,但是输入换行符却执行下面的语句,那么我的问题就是换行符怎么被清除的?

引用 10 楼 xu044 的回复:
while(getchar()!='\n')不只是清除回车,还能清除所有剩下的不符合输入条件的内容,这样就不会影响下次的输入了。

比如scanf("%d", &am……
[/Quote]
CCPP_Rookie 2010-06-10
  • 打赏
  • 举报
回复
我的理解:

最后输的那个回车符应该是会留在缓冲区的,并被下一个getchar或scanf(%c\%s)接受。

所以一般在后面有读取字符的操作前加上一个getchar(),来接受缓冲区的回车。

while()就是 10楼 所说的多输的字符的清除。
delphiwcdj 2010-06-10
  • 打赏
  • 举报
回复
参考rewind

#include <stdio.h>

void main(void)
{
int ch ;

puts( "Input two or more chars. One is read now." );
ch = getchar();
putchar( ch );
putchar( '\n' );

puts( "The next char is taken from stdin." );
ch = getchar( );
putchar( ch );
putchar( '\n' );

rewind( stdin );
puts( "Input two or more chars. One is read now." );
ch = getchar();
putchar( ch );
putchar( '\n' );

rewind( stdin );
puts( "You must enter another char because of the rewind(stdin)" );
ch = getchar( );
putchar( ch );
putchar( '\n' );
}
delphiwcdj 2010-06-10
  • 打赏
  • 举报
回复
while ((c=getchar())!='\n') ;这行代码主要用于清除缓存中的数据的,最后一个换行符当然也被清除了……
delphiwcdj 2010-06-10
  • 打赏
  • 举报
回复
getchar等待输入完毕直到按回车才结束,调试下面的代码可以发现

#include <cstdio>

int main()
{
int c=0;
while ((c=getchar())!='\n') ;
printf("%d\n",c);// 10
printf("%c\n",c);// 输出换行

return 0;
}

iverson8866 2010-06-10
  • 打赏
  • 举报
回复
我主要是想问一下那个最后输入的回车符是不是也被清除了,为什么?这句代码是当输入不是换行符的时候就跳过什么都不执行,但是输入换行符却执行下面的语句,那么我的问题就是换行符怎么被清除的?[Quote=引用 10 楼 xu044 的回复:]
while(getchar()!='\n')不只是清除回车,还能清除所有剩下的不符合输入条件的内容,这样就不会影响下次的输入了。

比如scanf("%d", &n) 你不小心输入了89ab\n,
这时只在后面加一个getchar()是不行的,如果使用while(getchar()!='\n')就可以清除回车前的所有非法输入

同意8楼,fflush只对stdout做了明确定义,……
[/Quote]
加载更多回复(1)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧