コンソールアプリを作成し、switch
ステートメントを使用してシンプルなメニューシステムを作成しています。ユーザー入力は、画面上に大文字として表示される単一の文字の形式です。ただし、プログラムで小文字と大文字の両方を受け入れるようにしたいのですが。
switch
ステートメントが定数との比較に使用されていることを理解していますが、次のようなことは可能ですか?
switch(menuChoice) {
case ('q' || 'Q'):
//Some code
break;
case ('s' || 'S'):
//More code
break;
default:
break;
}
これが不可能な場合、回避策はありますか?コードを繰り返したくありません。
こちらです:
switch(menuChoice) {
case 'q':
case 'Q':
//Some code
break;
case 's':
case 'S':
//More code
break;
default:
}
このために一般的に受け入れられている構文は次のとおりです。
switch(menuChoice) {
case 'q':
case 'Q':
//Some code
break;
case 's':
case 'S':
//More code
break;
default:
break;
}
つまり、break
がないため、プログラムの実行は次のブロックにカスケードされます。これは「フォールスルー」と呼ばれることがよくあります。
そうは言っても、もちろんこのインスタンスの「menuChoice」変数のケースをtoupper/tolowerを介して単純に正規化できます。
Switchステートメントを入力する前に、varでtolower fncを使用することができます(編集可能性の理由から、そうする必要があります)。
'q' || 'Q'
結果boolタイプの結果(true)これは、スイッチ条件で使用される整数型に昇格されます(char)-値1を与えます。コンパイラーが同じ値(1)を複数のラベルで使用することを許可した場合、switchステートメントの実行中にmenuChoice
がそれぞれの値1と比較されます。 menuChoice
の値が1の場合、最初のケースラベルの下のコードが実行されます。
したがって、ここで提案する回答では、各ケースラベルの整数値として文字定数(タイプchar)を使用しています。
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()
の両方を使用できます。
switch (toupper(choice))
{
case 'Q':...
}
...またはtolower。
もしあなたがそうするなら
case('s' || 'S'):
// some code
default:
// some code
s
とS
の両方が無視され、これらの文字を入力するたびにデフォルトのコードが実行されます。だからあなたは使うことに決めることができます
case 's':
case 'S':
// some code
または
switch(toupper(choice){
case 'S':
// some code.
toupper
にはctype.h
を含める必要があります。