我有一个令我困惑的小程序。我正在尝试使用循环从用户获取输入。如果输入错误,则再次重复,但如果输入正确,则退出。
代码段是:
void main()
{
char user_status; // Checks User Status q = Quiz Master and p = Participant
int valid_status = '0'; // Checks If User Status Is Valid Or Not. Used In Some Loops. 0 = Invalid, 1 = Invalid.
printf("Welcome to General Knowledge Quiz Management System.\nThis application has been designed to help you conduct a quiz or test your GK.");
do
{
user_status = '0';
printf("\n\nPlease enter your role.\nQuiz Master = \'q\'\nParticipant = \'p\'\n");
scanf("%c", &user_status);
if (user_status == 'q'|| user_status == 'Q')
{
printf("Initializing Quiz Master Segment\n\n________________________________\n");
initiate_qm();
valid_status = '1';
}
else if (user_status == 'p' || user_status == 'P')
{
printf("Initializing Participant Segment");
initiate_pa();
valid_status = '1';
}
}
while (valid_status != '1')
printf("\nProgram Will Exit Now. Press Any Key To Return To Windows.");
getch();
}
void main()
{
char user_status; // Checks User Status q = Quiz Master and p = Participant
int valid_status = '0'; // Checks If User Status Is Valid Or Not. Used In Some Loops. 0 = Invalid, 1 = Invalid.
printf("Welcome to General Knowledge Quiz Management System.\nThis application has been designed to help you conduct a quiz or test your GK.");
do
{
user_status = '0';
printf("\n\nPlease enter your role.\nQuiz Master = \'q\'\nParticipant = \'p\'\n");
scanf("%c", &user_status);
if (user_status == 'q'|| user_status == 'Q')
{
printf("Initializing Quiz Master Segment\n\n________________________________\n");
initiate_qm();
valid_status = '1';
}
else if (user_status == 'p' || user_status == 'P')
{
printf("Initializing Participant Segment");
initiate_pa();
valid_status = '1';
}
}
while (valid_status != '1')
printf("\nProgram Will Exit Now. Press Any Key To Return To Windows.");
getch();
}
我期待这个输出:
直到现在,它的效果很好。当我输入q / Q / p / P时,效果很好。但是当我输入错误时,它不会提供所需的输出。
例如,如果我输入“abc”,我应该再次得到上面的文字,要求我输入q或p。但相反,我得到了这个:
Please Enter Your Role
Quiz Master = 'q'
Participant = 'p'
现在,为什么要重复3次。有一点值得注意的是,如果我输入的内容长度为2个字符,则会重复2次,如果我将其留空(只需返回),则不会重复多次。
我必须只使用C.我正在使用Visual C ++ 2010进行编译。
感谢。
答案 0 :(得分:4)
因为您已经为scanf提供了三个要处理的字符。它首次调用scanf获取'a'时删除第一个第一个字符,但仍然在stdin缓冲区中保留'bc'。
在再次查找输入之前,您需要检查缓冲区中的剩余内容。而且我会避免刷新stdin缓冲区,因为它是未定义的行为。 (http://www.gidnetwork.com/b-57.html)
您可以阅读剩余的字符并使用
将其丢弃do{
scanf("%c", &user_status);
}while(user_status!='\n'); //This discards all characters until you get to a newline
在你读完你想要的角色之后。
答案 1 :(得分:1)
你想要
do
{
} while (condition);
当你忘了分号时,你会得到:
do
{
....
}
while(condition)
do something else;
您可能已经注意到,只需在编辑器中自动缩进代码,就像我在您的问题上所做的那样。
另外,当您执行某些scanf
时,您应该在格式规范中包含\n
。
答案 2 :(得分:0)
首先,# include <stdio.h>
并使用getc(stdin)
来获取角色。它可以帮助您防止光标移动并将不必要的字符放入控制台。
其次,在循环之前写下欢迎信息。