我想在C代码中做的是检查用户输入并验证他们只能输入“一个”或“两个”。我做了一个while循环,用strcmp
检查用户输入值,但它不起作用。 while循环似乎忽略了getchar();
并且进行了无限循环。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
char choice[80];
while(strcmp (choice,"one") != 0 || strcmp (choice,"two") != 0){
scanf("%s", &choice);
getchar();
}
// if the user enters either one or two, continue executing code...
return 0;
}
答案 0 :(得分:10)
当然你想要
while(strcmp (choice,"one") != 0 && strcmp (choice,"two") != 0)
如果输入不满足不等于或不等于两个条件,则当前版本将继续循环。如果它等于一个,它将不等于两个等....
你很少想要不等于子句一起OR化......
答案 1 :(得分:4)
我在您的代码中看到了3个问题:
while(strcmp (choice,"one") != 0 || strcmp (choice,"two") != 0)
此条件永远不会评估为false
。因为用户输入一个或两个或其他任何一个或两个strcmp条件都返回true。
scanf("%s", &choice);
那里不需要&
。要使用%s
将字符串读取到字符数组,您不需要使用&
(因为当您指定字符数组的名称时,地址是指向的)。
就像写:
scanf("%s", choice);
这是合乎逻辑的。你刚刚声明了一个字符数组。在下一行,您在strcmp
中使用它。当然阵列会有垃圾值。
实施您的代码,如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
char choice[80];
while(1)
{
scanf("%s", choice);
if(strcmp (choice,"one") == 0 || strcmp (choice,"two") == 0)
{
break;
}
getchar();
}
// if the user enters either one or two, continue executing code...
return 0;
}
答案 2 :(得分:2)
使用AND(&amp;&amp;)运算符代替OR(||)。
如果使用OR,如果任一条件为真,则该语句为真,如果使用AND,则仅当两个条件都为真时才为真。如果使用AND,只要选择既不是“一个”也不是“两个”,就会执行循环。
另一方面,键盘输入读数线应为sscanf("%s",choice);
,不带符号。
答案 3 :(得分:0)
在逻辑公式中,否定根据DeMorgan's Laws分配。所以!(a || b) == (!a && !b)
。