1

私は今c++を使い始めていますが、今は無効な入力をキャッチするための最も一般的で最良の方法を知りたいと思っています。この広く開かれた質問への回答が欲しいのですが、より具体的な質問は次のとおりです。

ユーザーからの文字が欲しい。charが「y」の場合は繰り返され、「n」の場合はプログラムが閉じます。複数の文字を入力すると、文字と同じ回数繰り返されます。たとえば、「hello」と入力すると、出力が5回表示されます。各文字を読み取り、ループ全体を通過してから、次の文字を順番に読み取ると仮定します。どうすれば一度だけ表示させることができますか?

bool valid = 0;
while(valid)
{

...

    bool secValid = 0;
    while(secValid == 0)
    {
        cout << "To enter another taxable income type 'y': \n\n";
        char repeat = NULL;
        cin >> repeat;
        if(repeat == 'y')
        {
            valid = 0;
            secValid = 0;
            system("cls");
        }else if(repeat == 'n')
        {
            return;
        }else
        {
            secValid = 1;
        }
    }
}
4

4 に答える 4

3

次のように構成できます。

while(true) {
    cout << "Repeat (y/n)? ";
    string line;
    if(!getline(cin, line))
        break; // stream closed or other read error
    if(line == "y") {
        continue;
    } else if(line == "n") {
        break;
    } else {
        cout << "Invalid input." << endl;
    }
}

セッション例:

Repeat (y/n)? y
Repeat (y/n)? foo
Invalid input.
Repeat (y/n)? n

ここではstd::getline、一度に1文字を取得するのではなく、入力の行全体を取得するために使用します。

于 2012-10-24T05:29:31.680 に答える
2

ヘッダーから使用std::getlineして、入力行を<string>std::string

于 2012-10-24T05:31:36.037 に答える
2

std::getline()

std::string line;
std::getline(std::cin, line);
if (line == "y") {
   // handle yes
}
else if (line == "n") {
   // handle no
}
else {
   // handle invalid input
}
于 2012-10-24T05:30:36.840 に答える
2

また、文字列の「y」または「n」をチェックするときは、代わりに大文字の文字列を使用することをお勧めします。例えば

std::string YES = "Y";
std::string NO = "N";
...
std::string line;
std::getline(std::cin, line);
std::transform(line.begin(), line.end(), line.begin(), std::toupper);
if (line == YES)
{
    ...
}
else if (line == NO)
{
    ..

。}

于 2012-10-24T05:57:17.383 に答える