3

if else ステートメントを使用してプログラムのフローを制御するために YES や NO などのユーザー入力を取得する方法について質問を投稿しました。回答を得て、これを機能させることに一歩近づきましたが、別の問題が発生しました。私は本当に複数の入力を許可する必要があります。たとえば、これは私がしようとしているものです:

if (input == ("YES" || "yes" || "y" || "Yes" || "Y"))
{
    cout << "you said yes" << endl;
}
else if (input == "NO", "no", "n", "No","N")
{
    cout << "you said no" << endl;
}
else 
{
    cout <<  "ERROR!!!" << endl;
}

Kiril Kirov は、役立つ次のコードを投稿しました。

if( std::string::npos != input.find( "no" ) )

しかし、私はそれを機能させることができず、ロジャー・パテがこれを提案しました:

if (prompt && cin.tie()) {
*cin.tie() << prompt << (default_yes ? " [Yn] " : " [yN] ");

ただし、その複雑さは私の理解をはるかに超えているため、これを試したことはありません。私は、初心者のプログラマーが理解できる解決策を望んでいました。


EDIT:私はこの変更を行いましたが、以前よりもうまく機能しません。間違ったケースを指定すると、else(エラー)になり、単語を追加する場所がありません(NO N NO NOなど):

cout << "\nYES or NO" << endl;
string input ="";
cin >> input;

if ( std::string::npos != input.find( "yes" ) )
{
    cout << "you said yes" << endl;
}
else if ( std::string::npos != input.find( "no" ) )
{
    cout << "you said no" << endl;
}
else 
{
    cout <<  "ERROR!!!" << endl;
}
4

4 に答える 4

2

ヘッダーを追加します

#include <algorithm>
#include <cctype>

cout << "\nYES or NO" << endl; 
string input =""; 
cin >> input; 
transform (input.begin(), input.end(), input.begin(),tolower);

if ( (std::string::npos != input.find( "yes" )) || (std::string::npos != input.find( "y" )) ) 
{
     cout << "you said yes \n" ; 
}
else if ( (std::string::npos != input.find( "no" ) )  || (std::string::npos != input.find( "n" ) ) )
{
    cout << "you said no \n" ; 
}
else  
{
    cout <<  "ERROR!!! \n" ; 
}
于 2010-11-05T15:11:32.100 に答える
0

ほとんどの言語では、文字列を比較する前に文字列を大文字にするのが簡単な方法です。

標準のC++では、残念ながら大文字はより複雑です。考えられるすべてのケースで完全に機能しない新機能を使用することには、非常に強い抵抗が必要です。また、大文字と小文字の区別は、その性質上、国によって異なり、場合によってはコンテキストに依存する場合もありますが、考えられるすべてのケースで完全に機能するとは限りません。

それに加えて、Cライブラリの大文字関数を正しく使用するのは少し難しいです。

ダン、私はあなたにここで合理的な大文字の関数を与えるでしょうが、時間はありません。:-(大文字に関する以前の質問を検索してください。それでうまくいくはずです!:-)

乾杯、

于 2010-11-05T14:13:51.073 に答える
0

より簡単な方法は、事前にケースを変換することです。ユーザーが入力を有効な文字列 (yes/no) の 1 つに制限すると仮定します。

Boost.Stringを確認してください。これは、クラスのアルゴリズムのコレクションですstd::string(特にここではケース変換ルーチン)。

ASCII 文字にはうまく機能しますが、それで問題ないと話しているのでstd::string、日本語やアラビア語を扱う予定はありませんね :) ?

于 2010-11-05T14:25:49.013 に答える
0

文字列の最初の 2 文字をチェックして、それらが n N か Y y かどうかを確認してみてはどうでしょうか?

しばらく C++ 文字列を使用していませんが、興味深い関数がいくつかあります。このサイトを見てください。たとえば、文字列の長さを取ることができます。次に 、私が好きな関数を使用して、位置 0、1、および可能であれば 2 の文字を取得でき ます。その後、最初の文字が Y、y、N、n であるかどうかを確認します。ユーザーがナンセンスを入力していないことをさらに確認したい場合は続行できます (最初の文字が N または n の場合、2 番目の文字が O または o であるかどうかを確認します)。単純な決定にはこれで十分だと思います。 .

于 2010-11-05T14:55:11.353 に答える