请帮我解决这个明显愚蠢的错误
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<ctime>
int main()
{
srand((unsigned)time(NULL));
int No_of_Q = 0; //number of questions
int m1, m2, ans; //two operands and answer
int ra = 0; //number of right answers
int wa = 0; //number of wrong answers
char c = 'y'; //whether to continue
printf("Let's play multiply!\n");
do
{
printf("How many questions would you like to attempt? ");
scanf_s("%d", &No_of_Q);
printf("\n");
for(int i=1; i<=No_of_Q; i++)
{
m1=(rand()%10 + 1);
m2=(rand()%10 + 1);
printf("\nWhat is %d x %d = ", m1, m2);
scanf_s("%d",&ans);
if(ans== m1*m2)
{
printf("Your answer is correct!\n");
ra++ ;
}
else{
printf("Wrong, the correct answer is %d.\n", m1*m2);
wa++ ;
}
}
printf("\n\nOut of %d answers, %d were correct and %d wrong.\n",No_of_Q, ra, wa);
if(wa==0)
printf("Congratulations!\n");
else
printf("Better luck next time!\n");
printf("Continue game? ");
scanf_s("%c", &c ); /*-------CANNOT GET THIS TO PERFORM--------------*/
//printf("%c",c);
}
while(c=='y');
return 0;
}
我正在使用vs 2012快递版。 我无法让我的程序扫描答案,以便在程序结束时继续。 最后的while语句不计算。 请帮忙。
答案 0 :(得分:0)
问题在于,您的专线scanf_s("%d", &ans);
会在该号码后读取但不包括换行符。 scanf_s("%c", &c);
然后读取换行符,而不是'y'
,因此循环失败。
这就是为什么你会发现许多人(包括我自己)建议用fgets()
阅读回复,然后用sscanf_s()
转换输入。
您还应检查scanf_s()
是否返回正确的值(提及的两个调用为1) - 或者fgets()
和sscanf_s()
返回正确的值(fgets(line, sizeof(line), stdin) != 0
和sscanf_s(...) == 1)
)。
您还应该注意#include <ctime>
是C ++标题; C标头是#include <time.h>
。我没有看到#include <conio.h>
的使用,所以你可以省略它。
此外,使用%c
转换时,您误拨scanf_s()
。正如BluePixy comment指出的那样,您应该在&c
之后传递1的长度:
if (scanf("%c", &c, 1U) != 1)
...oops...
C11(ISO / IEC 9899:2011)附件K涵盖了界限检查界面,并且大致相同。
答案 1 :(得分:0)
使用scanf_s("%c", &c );
功能两次而不是一次。第一个将获得'\n'
字符,然后它将被您的输入替换。
printf("Continue game? ");
scanf_s("%c", &c ); /*-------WILL GET '\n'--------------*/
scanf_s("%c", &c ); /*-------WILL ASK FOR INPUT--------------*/