web-dev-qa-db-ja.com

またはを使用したステートメントの切り替え

コンソールアプリを作成し、switchステートメントを使用してシンプルなメニューシステムを作成しています。ユーザー入力は、画面上に大文字として表示される単一の文字の形式です。ただし、プログラムで小文字と大文字の両方を受け入れるようにしたいのですが。

switchステートメントが定数との比較に使用されていることを理解していますが、次のようなことは可能ですか?

switch(menuChoice) {
    case ('q' || 'Q'):
        //Some code
        break;
    case ('s' || 'S'):
        //More code
        break;
    default:
        break;
}

これが不可能な場合、回避策はありますか?コードを繰り返したくありません。

29
Saladin Akara

こちらです:

 switch(menuChoice) {
    case 'q':
    case 'Q':
        //Some code
        break;
    case 's':
    case 'S':
        //More code
        break;
    default:
 }

そのトピックの詳細: http://en.wikipedia.org/wiki/Switch_statement#C.2C_C.2B.2B.2C_Java.2C_PHP.2C_ActionScript.2C_JavaScript

46
Chris Hasiński

このために一般的に受け入れられている構文は次のとおりです。

switch(menuChoice) {
    case 'q':
    case 'Q':
        //Some code
        break;
    case 's':
    case 'S':
        //More code
        break;
    default:
        break;
}

つまり、breakがないため、プログラムの実行は次のブロックにカスケードされます。これは「フォールスルー」と呼ばれることがよくあります。

そうは言っても、もちろんこのインスタンスの「menuChoice」変数のケースをtoupper/tolowerを介して単純に正規化できます。

20
John Parker

Switchステートメントを入力する前に、varでtolower fncを使用することができます(編集可能性の理由から、そうする必要があります)。

'q' || 'Q'結果boolタイプの結果(true)これは、スイッチ条件で使用される整数型に昇格されます(char)-値1を与えます。コンパイラーが同じ値(1)を複数のラベルで使用することを許可した場合、switchステートメントの実行中にmenuChoiceがそれぞれの値1と比較されます。 menuChoiceの値が1の場合、最初のケースラベルの下のコードが実行されます。

したがって、ここで提案する回答では、各ケースラベルの整数値として文字定数(タイプchar)を使用しています。

3
Bojan Komazec

tolower()を使用するだけです。これが私の男です。

[〜#〜] synopsis [〜#〜]
#include ctype.h

_   int toupper(int c);
   int tolower(int c);
_

[〜#〜] description [〜#〜] toupper()は、可能であれば、文字cを大文字に変換します。

_   tolower() converts the letter c to lower case, if possible.

   If c is not an unsigned char value, or EOF, the behavior of these
   functions is undefined.
_

戻り値返される値は、変換された文字の値、または変換が不可能な場合はcです。

だからあなたの例ではあなたはswitch()で次のことができます:

_switch(tolower(menuChoice)) {
    case('q'):
        // ...
        break;
    case('s'):
        // ...
        break;
}
_

もちろん、大文字と非大文字の両方でtoupper()tolower()の両方を使用できます。

3
BlackBear
switch (toupper(choice))
{
  case 'Q':...
}

...またはtolower。

2
Edward Strange

もしあなたがそうするなら

case('s' || 'S'):
    // some code
default:
    // some code

sSの両方が無視され、これらの文字を入力するたびにデフォルトのコードが実行されます。だからあなたは使うことに決めることができます

case 's':
case 'S':
    // some code

または

switch(toupper(choice){
    case 'S':
        // some code.

toupperにはctype.hを含める必要があります。

0
eyong kevin