-1

ちょっと私はそれが男性または女性のためにmまたはfを受け入れることに制限するためにcharを検証しようとしています。ただし、mまたはfを押しても、while条件を通過せず、質問をループし続けます。

誰かがこれで私を助けることができますか?前もって感謝します。これが私のコードです:

char Validator :: getChar(string q)
{
    char input;
    do
    {
        cout << q.c_str() << endl;
        cin >> input;
    }
    while(!isalpha(input) && "M"||"F"||"m"||"f");
    return input;
}
4

3 に答える 3

2

あなたのコードの"M"||"F"||"m"||"f"一部はあなたが思っていることをしません。それが行うことは、それらの文字列定数のアドレスをチェックすることです。これらはすべてNULL以外であるため、この式は単純にtrueを返します。したがって、条件は基本的に次のようになります。while(!isalpha(input) && true)これは。と同じwhile(!isalpha(input))です。

代わりにこれを試してください:

char Validator::getChar(const string &q)
{
    char input = 0;

    do
    {
        cout << q << endl;
        cin >> input;
    }
    while((input != 'M') && (input != 'F') && (input != 'm') && (input != 'f'));

    return input;
}
于 2012-11-28T22:16:43.170 に答える
1

の表現は、whileあなたが思っていることを意味するものではありません。まず、は式全体!には適用されません。次に、「同等性」は暗黙のテストではありません。あなたはあなたが意味するすべてを書き出す必要があります。

等しいかどうかをテストするには、==または!=演算子を使用します。テストするすべての値で演算子を使用する必要があります。演算子は、通常の英語のように値のリストを「配布」しません。次のように条件を記述します。

while (input != 'M' && input != 'F' && input != 'm' && input != 'f');

isalpha呼び出しは必要ないことがわかります。がリストされている値のいずれとも等しくない場合input、それが英字であるかどうかは実際には問題ではありません。

それを書く別の方法はこれです:

while (!(input == 'M' || input == 'F' || input == 'm' || input == 'f'));

!演算子が最初の用語だけでなく式全体に適用されるように、内部用語の周りに別の括弧のセットがあることに注意してください。

于 2012-11-28T22:14:14.527 に答える
1

終了条件への代替アプローチのためだけに:

char Validator::getChar(const string &q)
{
    const std::set<char> valid_chars { 'M', 'm', 'F', 'f' };
    char input = 0;

    do
    {
        cout << q << endl;
        cin >> input;
    }
    while (!valid_chars.count(q));

    return input;
}
于 2012-11-28T22:29:08.967 に答える