if (word[0] == 'a'||'e'||'i'||'o'||'u'||'A'||'E'||'I'||'O'||'U')
これは||
、C++での動作とは異なります。ただし、上記の結果、コンパイルエラーが発生するわけではありません。いいえ、それはコンパイラの観点からは正しいです。それに関する唯一の問題は、それがあなたが意図したことをしないということです!代わりに、条件は常にになりますtrue
。これが、コード内のすべての単語の最初の文字を出力する理由です。
意図したものを取得するには、次のように記述する必要があります||
。
if (word[0] == 'a'|| word[0] == 'e'|| word[0] == 'i' || ... so on)
つまり、すべての文字を個別に比較する必要があります。それは確かに苛立たしいことです。
C ++ 11はこれからあなたを救うようになったので、あなたは次のように使うことができますstd::any_of
:
//C++11 only
std::string const v = "aeiouAEIOU";
if (std::any_of(v.begin(), v.end(), [](char c){ return word[0] == c;})
または、次のように使用できますstd::find
。
//C++03 and C++11 both
if ( std::find(v.begin(), v.end(), word[0]) != v.end() )
前のものより少し短くなりました。さらに、これはC ++ 03でも機能します!
または、次のように使用できますstd::count
。
//C++03 and C++11 both
if ( std::count(v.begin(), v.end(), word[0]) )
これはさらに短いです。
または、次のように使用できますstd::string::find
。
//C++03 and C++11 both
if ( v.find(word[0]) != std::string::npos)
最短です!
ドキュメントを読んで、それぞれが実際に何をするのか、そしてなぜそれがあなたのケースで機能するのかを理解してください:
お役に立てば幸いです。