鱼C论坛

 找回密码
 立即注册
查看: 2086|回复: 8

[已解决]while(getchar()!='y')每次读取用户的几个输入?

[复制链接]
发表于 2018-10-18 09:35:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
书上有个例子一直不太明白,求助各位大神
下面是例子的一部分(头文件省略)

int guess =1;
printf("is you number %d?\n",guess)

while(getchar()!='y')
{
printf("is it %d?\n",++guess);
while(getchar()!='\n') /*跳过剩余的输入行*/
   continue;
}

在这个例子中,假设用户输入的是noitisnot
我一直以为,第一个外层while循环需要一个字母一个字母的读用户输入(因为getchar每次职能读一个字符),它先读n,于是n进入大循环
大循环里面的printf("is it %d?\n",++guess)打印完了以后,n进入下一句也就是里面的while小循环,然后结束。
接下来外层while大循环再读下一个用户输入u,把整个循环再跑一遍。

但如果是这样,就没法实现小循环”跳过剩余的输入行“这个功能了
可是如果要实现这个功能,外层的while循环就要每次把用户输入的字母全都读进来,让noitisnot全部进入循环,可是getchar()每次职能读一个字母啊。。。

所以只剩下一种情况:
外层大循环先读一个字母,然后打印那一行,接着里面小循环读剩下的字母,用continue不断的跳过剩余的字母,循环结束。

然而问题是,里层的小循环是大循环的一部分,大循环只读了一个字母,那么应该就只有一个字母先进入循环,等把循环内容全部跑一遍再放第二个字母进来
小循环为什么可以直接读后面的字母?
最佳答案
2018-10-19 11:28:17
这是一个while的循环嵌套,也就是while里面还有一个while。至于这个getchar,这个程序有两个getchar,外层while一个,内层while一个。每使用一次getchar他就会从输入流里面读取一个字符。至于你说的 noitisnot 这几个字母,首先是外层循环也就是第一个while读一个 n ,然后进入外层,printf打印一下,此时就要执行内层循环了,内层循环还有一个 getchar ,就要再获得一个,也就是获得了 n 后面的 o 这个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-18 10:52:21 | 显示全部楼层
你就让
char c =getchar();
判断 c == 'y' || c = 'Y'
如果不是, fflush(stdin),不管后面的东西了,然后重新输入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-18 15:59:03 From FishC Mobile | 显示全部楼层
我觉得while(getchar()!='\n') 是用来跳过回车的 你可以试试把
   while(getchar()!='\n') /*跳过剩余的输入行*/
   continue; 这个去掉 运行对比一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-19 09:52:55 | 显示全部楼层
claws0n 发表于 2018-10-18 10:52
你就让
char c =getchar();
判断 c == 'y' || c = 'Y'

谢谢您,我还是初学,还没有学到fflush(stdin)。。。
我主要是想问,在书上的这个例子中,外层的while大循环是一个字母一个字母的读用户的输入吗?
如果是这样,应该等首字母全部经历过一遍大循环的所有内容再放下一个字母进来
内层的while小循环里面的getchar()为什么可以直接读首字母后面的剩余字母?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-19 10:25:36 | 显示全部楼层
猫三壮 发表于 2018-10-19 09:52
谢谢您,我还是初学,还没有学到fflush(stdin)。。。
我主要是想问,在书上的这个例子中,外层的while大 ...

while(getchar()!='\n') /*跳过剩余的输入行*/
   continue;

getchar() 是从输入缓冲区里取出字符的,你输入 n 然后回车,那么输入流会是 'n','\n'。现在不管你输入什么,'n',......,'\n' 只要不等于回车,一直继续走。这样就可以跳过后面的所有东西。
fflush(stdin) 是一样的功能,但不一样的地方在于 fflush() 是清空,而 while() 这种做法是往后移动,会满的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-19 11:28:17 | 显示全部楼层    本楼为最佳答案   
这是一个while的循环嵌套,也就是while里面还有一个while。至于这个getchar,这个程序有两个getchar,外层while一个,内层while一个。每使用一次getchar他就会从输入流里面读取一个字符。至于你说的 noitisnot 这几个字母,首先是外层循环也就是第一个while读一个 n ,然后进入外层,printf打印一下,此时就要执行内层循环了,内层循环还有一个 getchar ,就要再获得一个,也就是获得了 n 后面的 o 这个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-19 11:41:06 | 显示全部楼层
啊涂涂 发表于 2018-10-19 11:28
这是一个while的循环嵌套,也就是while里面还有一个while。至于这个getchar,这个程序有两个getchar,外层w ...

十分感谢您,我之前还一直以为如果是一个字母先进入外层循环,在没有走完整个外层大循环的过程前,下一个字母不会进入内层循环。。。
另外还想请教一下您,如果在这个例子中,外层while循环中的括号内是((ch=getchar())!=‘y'),内层while循环括号内的是((ch=getchar())!=‘\n'),内层循环是否还会读取n后面的字母o?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-10-19 11:43:06 | 显示全部楼层
猫三壮 发表于 2018-10-19 11:41
十分感谢您,我之前还一直以为如果是一个字母先进入外层循环,在没有走完整个外层大循环的过程前,下一个 ...

这样也会,调用了getchar就会,内层循环获得的字符 o 会把ch里面原本储存的 n 给覆盖住
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-19 11:44:23 | 显示全部楼层

不用谢,鱼C的鱼油们都是很友好的。我也是通过问别的鱼油一点一点掌握的,感谢鱼C!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 14:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表