我正在为学校实验室创建一块石头,纸,剪刀代码。我只是想测试无效条目,但是尽管输入了有效字符,但我仍陷于连续的while循环中。
printf("\nEnter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
scanf("%c", &input);
if(input=='Q' || input=='q') {
return 0;
}
while(input!='R' || input!='r' || input!='P' || input!='p' || input!='S' || input!='s' || input!='Q' || input!='q') {
printf("\nInvalid entry! Please enter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
scanf(" %c", &input);
}
任何帮助将不胜感激!
答案 0 :(得分:2)
您需要将while循环中的所有OR运算符更改为AND运算符。如果它们是OR运算符,则所有输入均为true。
`
printf("\nEnter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
scanf("%c", &input);
if(input=='Q' || input=='q') {
return 0;
}
while(input!='R' && input!='r' && input!='P' && input!='p' && input!='S' && input!='s' && input!='Q' && input!='q') {
printf("\nInvalid entry! Please enter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
scanf(" %c", &input);
}
`
答案 1 :(得分:1)
似乎您的代码中存在经典的逻辑错误。我也花了一些时间来捕捉它,因为使用or(||
)似乎很有意义。但是,在这种情况下,如果您考虑一下,计算机将正确地遵循您的说明,并且永远不会让您离开循环。您真正的意思是,如果您输入的内容不同于'R'和({&&
)'r'和'P'和'p'...,那是无效的。
在另一个不相关的主题上,始终检查输入函数调用的返回值可能是一个好主意。在这种情况下,您可能想要编写类似
的内容while (1) { /* infinite loop */
printf("\nEnter (r)ock, (p)aper, or (s)cissors. Enter (q) to quit.");
if (scanf(" %c", &c) != EOF) {
if (c == 'q' || c == 'Q') {
break;
} else if (c == 'r' || c == 'R') {
/* rock */
} else if (/* paper, etc... */) {
/* ... */
} else {
/* you can say here that the input is not valid */
}
} else {
printf("\nBye!\n");
break;
}
}
如果使用* NIX终端(例如Linux或BSD),则作为“奖励”,您将可以通过键入Ctrl-D(^ D)退出循环,这将导致scanf返回EOF 。请记住,如果您曾经写过无限循环(例如在我的示例中,while(1)循环),请务必格外小心。您必须提供一些摆脱这些循环的方法。