0

我想在我的 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;
     }
4

4 回答 4

10

你肯定想要

while(strcmp (choice,"one") != 0 && strcmp (choice,"two") != 0)

如果您的输入不满足不等于一不等于二的条件,您当前的版本将继续循环。如果它等于,它不会等于等等......

您很少希望将不等于子句或在一起...

于 2013-06-12T16:32:28.777 回答
4

我在您的代码中看到了 3 个问题:

1

while(strcmp (choice,"one") != 0 || strcmp (choice,"two") != 0)

此条件永远不会计算为false。因为用户输入一个或两个或其他任何一个或两个 strcmp 条件都返回 true。

2

 scanf("%s", &choice);

不需要&那里。对于使用%s您不需要使用的字符数组读取字符串&(因为当您指定字符数组的名称时,地址是指向的)。

就像这样写:

scanf("%s", choice);

3

这是合乎逻辑的。您刚刚声明了一个字符数组。在下一行,您将在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;
}
于 2013-06-12T18:39:26.663 回答
2

使用 AND (&&) 运算符代替 OR (||)。

如果使用 OR,则如果任一条件为真,则该语句为真;如果使用 AND,则仅当两个条件都为真时,该语句才为真。如果使用 AND,只要选择既不是“一”也不是“二”,就会执行循环。

另一方面,键盘输入阅读线应该sscanf("%s",choice);没有&符号。

于 2013-06-12T16:38:11.973 回答
0

在逻辑公式中,否定根据德摩根定律分布。所以!(a || b) == (!a && !b)

于 2013-06-12T16:51:18.013 回答