新手--while循环中两次scanf的问题

freshairyz25 2010-03-19 11:11:56
问题描述:如下题,连续两次输入时循环终止,不知道什么原因,如何修改?
int main()
{
char cChoice='y';
int nTest1, nTest2, nTest3, nPass, nFail, nAvg;
nPass=0;
nFail=0;
while(cChoice=='y')
{
printf("请输入三次考试成绩:\n");
scanf("%d,%d,%d",&nTest1,&nTest2,&nTest3);
nAvg = (nTest1+nTest2+nTest3)/3;
if((nTest1>75)&&(nTest2>75)&&(nTest3>75)&&(nAvg>=80))
nPass++;
else
nFail++;
printf("\n");
printf("是否继续输入按y继续,否则退出:\n");
scanf("%c",&cChoice);
}
printf("pass:%d,fail:%d\n",nPass,nFail);
system("pause");
return 0;
}
...全文
427 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lucky-lucky 2010-03-19
  • 打赏
  • 举报
回复
汗!!我继续想想
huanmie_09 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 freshairyz25 的回复:]
2,3楼正解,可否详解一下原因!
[/Quote]
while循环里scanf("%d,%d,%d",&nTest1,&nTest2,&nTest3);
这是scanf()输入函数的原理.
输入80,80,80回车,这时输入内容将放到缓冲区。
scanf对输入进行匹配,第一个%d匹配80,当匹配到第一个逗号时,逗号不是整数表示形式,停止匹配,将当前匹配失败的逗号放回缓冲区,并将80保存到变量nTest1;第一个%d后的逗号正好匹配此时缓冲区的逗号。
一次匹配第二、三个整数.匹配第三个整数后,还有一个回车符在缓冲区中,因此scanf("%c",&cChoice);
之前,要先清空缓冲区。否则,回车符就会自动保存到cChoice变量中。这样,输入一次循环就结束了。
linyongzuo 2010-03-19
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080102/11/fc54c74b-f6eb-4f7a-bcdd-4c04906a6a25.html
freshairyz25 2010-03-19
  • 打赏
  • 举报
回复
2,3楼正解,可否详解一下原因!
huanmie_09 2010-03-19
  • 打赏
  • 举报
回复
晕。2楼。
huanmie_09 2010-03-19
  • 打赏
  • 举报
回复

#include<stdio.h>

int main()
{
char cChoice='y';
int nTest1, nTest2, nTest3, nPass, nFail, nAvg;
nPass=0;
nFail=0;
while(cChoice=='y') {
printf("请输入三次考试成绩:\n");
scanf("%d,%d,%d",&nTest1,&nTest2,&nTest3);
nAvg = (nTest1+nTest2+nTest3)/3;
if((nTest1>75)&&(nTest2>75)&&(nTest3>75)&&(nAvg>=80))
nPass++;
else
nFail++;
printf("\n");
printf("是否继续输入按y继续,否则退出:\n");
fflush(stdin); /*刷新缓冲流*/
scanf("%c",&cChoice);
}
printf("pass:%d,fail:%d\n",nPass,nFail);
system("pause");
return 0;
}
昵称很不好取 2010-03-19
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "math.h"
int main()
{
char cChoice='y';
int nTest1, nTest2, nTest3, nPass, nFail, nAvg;
nPass=0;
nFail=0;
while(cChoice=='y')
{
printf("请输入三次考试成绩:\n");
scanf("%d,%d,%d",&nTest1,&nTest2,&nTest3);
nAvg = (nTest1+nTest2+nTest3)/3;
if((nTest1>75)&&(nTest2>75)&&(nTest3>75)&&(nAvg>=80))
nPass++;
else
nFail++;
printf("\n");
printf("是否继续输入按y继续,否则退出:\n");
fflush(stdin); //清空下缓冲区中保留的回车
scanf("%c",&cChoice);
}
printf("pass:%d,fail:%d\n",nPass,nFail);
system("pause");
return 0;
}
james_hw 2010-03-19
  • 打赏
  • 举报
回复
没看出问题,汗
liyanlin122 2010-03-19
  • 打赏
  • 举报
回复
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
char cChoice='y';
int nTest1, nTest2, nTest3, nPass, nFail, nAvg;
nPass=0;
nFail=0;
while(cChoice=='y')
{
printf("请输入三次考试成绩:\n");
scanf("%d,%d,%d",&nTest1,&nTest2,&nTest3);

fflush(stdin);//清空下缓冲区中保留的回车

nAvg = (nTest1+nTest2+nTest3)/3;
if((nTest1>75)&&(nTest2>75)&&(nTest3>75)&&(nAvg>=80))
nPass++;
else
nFail++;
printf("\n");
printf("是否继续输入按y继续,否则退出:\n");
scanf("%c",&cChoice);
}
printf("pass:%d,fail:%d\n",nPass,nFail);
system("pause");
return 0;
}

注意scanf("%c",&cChoice);的使用
极易出错,它会把回车'\n'也作为字符而输入
匚匚 2010-03-19
  • 打赏
  • 举报
回复
fseek(stdin,0L,2);

69,371

社区成员

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

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