语言:C
编译器:Visual Studio 2017 / Win 32
所以基本上我的任务是制作一个乘法游戏,它采用两个随机的单位数字,并提示用户将它们相乘。该程序必须是防弹的,因此它必须循环用户,直到他们输入正确的输入(例如,如果他们输入一个字母,它必须循环它们直到他们输入正确的NUMBER)。我已经尝试了几个东西,而do / while循环似乎运行得很好。但是,当用户输入错误答案并再次尝试时,2ND do / while循环中的scanf将使它们输入两个输入(忽略第一个输入)。我过去遇到过这个问题并尝试了无数次修复它,但我无法找到解决方案。任何帮助将非常感激。
谢谢!
尝试使用fgets。悲惨地失败了。我删除了getchar()!='\ n'。这工作,但程序将循环“请输入一个整数”无限。
while (answer != correct)
{
srand(time(NULL));
int wrong = 1 + rand() % 5;
switch (wrong)
{
case 1:
SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
printf("\n ***\n");
printf(" Wrong!\n");
printf(" ***\n");
SetConsoleTextAttribute(h, wOldColorAttrs);
break;
case 2:
SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
printf("\n ***\n");
printf(" Nope!\n");
printf(" ***\n");
SetConsoleTextAttribute(h, wOldColorAttrs);
break;
case 3:
SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
printf("\n ***\n");
printf(" Not quite!\n");
printf(" ***\n");
SetConsoleTextAttribute(h, wOldColorAttrs);
break;
case 4:
SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
printf("\n ***\n");
printf(" Incorrect!\n");
printf(" ***\n");
SetConsoleTextAttribute(h, wOldColorAttrs);
break;
case 5:
SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
printf("\n ***\n");
printf(" Nope! Try again!\n");
printf(" ***\n");
SetConsoleTextAttribute(h, wOldColorAttrs);
break;
}
do {
printf("Enter a number to represent your answer! ");
while (getchar() != '\n');
} while (scanf_s("%d", &answer) != 1);
getchar();
}
我只是希望用户能够顺利输入数字,而不会产生令人困惑的scanf错误。
您可以像此示例中那样获取输入
#include <stdio.h>
int main(void)
{
char anstr[100];
int answer;
do {
printf("Enter ... answer! ");
if(fgets(anstr, sizeof anstr, stdin) == NULL) {
return 1;
}
} while(sscanf_s(anstr, "%d", &answer) != 1);
printf("The answer is %d\n", answer);
return 0;
}
基于%d
格式说明符将消耗所有前导空格,并且通过读取另一个字符串输入将丢弃错误输入。
计划会议:
Enter ... answer! alice Enter ... answer! bob Enter ... answer! 42 The answer is 42