strcmp不能在while循环中工作

时间:2013-06-12 16:29:54

标签: c while-loop strcmp

我想在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 个答案:

答案 0 :(得分:10)

当然你想要

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

如果输入不满足不等于不等于两个条件,则当前版本将继续循环。如果它等于一个,它将不等于两个等....

你很少想要不等于子句一起OR化......

答案 1 :(得分: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;
}

答案 2 :(得分:2)

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

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

另一方面,键盘输入读数线应为sscanf("%s",choice);,不带符号。

答案 3 :(得分:0)

在逻辑公式中,否定根据DeMorgan's Laws分配。所以!(a || b) == (!a && !b)