求高手帮忙看看我的这段C语言程序错在哪?

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
void main()
{
char ch;
for(;;)
{
do{
printf("input'E',输入数据\n");
printf("input'R',读取数据\n");
printf("input'Q',退出程序\n");
ch=toupper(getchar());
}while(ch!='E'&&ch!='Q'&&ch!='R');
switch(ch)
{
case 'E':break;
case 'R':break;
case 'Q': exit(0);
}
}
}
“input'E',输入数据
input'R',读取数据
input'Q',退出程序”为什么会多输出一次?要怎么改?

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
void main()
{
char ch;
for(;;)
{
do{
printf("input'E',输入数据\n");
printf("input'R',读取数据\n");
printf("input'Q',退出程序\n");
flushall(); //新加的!新加的!新加的!
ch=toupper(getchar());
}while(ch!='E'&&ch!='Q'&&ch!='R');
switch(ch)
{
case 'E':break;
case 'R':break;
case 'Q': exit(0);
}
}
}追问

大侠能解释一下吗?

追答

flushall();//清除键盘缓冲区,即清除每次输入的回车符。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-10
getchar()的问题
当程序调用getchar()时,程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符
注意:回车字符也放在缓冲区中的
所以你上面的问题就是getchar()吃了回车,把它也当作一次字符输入走了while循环
也就是说你一次性输入多少个字符,它就会有多少次输出
如你输入:ERERERERER 再按回车
那会就会输出11次(+回车键)
“input'E',输入数据
input'R',读取数据
input'Q',退出程序”
解决办法一:
使用getch()函数,需要头文件<conio.h>,但这个函数不等待用户按回车,只要用户按一个键,getch就立刻返回,且输入的字符不回显在屏幕上
do{
printf("input'E',输入数据\n");
printf("input'R',读取数据\n");
printf("input'Q',退出程序\n");
ch=toupper(getch());
printf("%c\n", ch );
}while(ch!='E'&&ch!='Q'&&ch!='R');

解决办法二:
调用flushall()函数,一次只从缓冲区读取一个字符后清空缓冲区
do{
flushall(); // 在这里调用
printf("input'E',输入数据\n");
printf("input'R',读取数据\n");
printf("input'Q',退出程序\n");
ch=toupper(getchar());
}while(ch!='E'&&ch!='Q'&&ch!='R');

当然,根据自己的功能进行需求吧
第2个回答  2011-07-10
先用while再用do试
相似回答