0

私の C コードでやりたいことは、ユーザー入力をチェックして、「1」または「2」のいずれかしか入力できないことを検証することです。でユーザー入力値をチェックする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)

入力が「1 に等しくない」または「2 に等しくない」条件を満たさない場合、現在のバージョンはループし続けます。1に等しい場合、 2には等しくなりません。

not equals句を一緒に OR したいことはめったにありません...

于 2013-06-12T16:32:28.777 に答える
4

コードに 3 つの問題がありました。

1

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

この条件が に評価されることはありませんfalse。ユーザーが 1 つまたは 2 つ、またはその他のいずれかを入力したため、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 に答える
0

論理式では、否定はDeMorgan の法則に従って分配されます。だから!(a || b) == (!a && !b)

于 2013-06-12T16:51:18.013 に答える