0

単語をテキストファイルからピッグラテン語に変換するプログラムを書こうとしています。テキストファイルの単語を分離するコードを取得しましたが、それらを整理しようとすると問題が発生します。このコードを実行すると、ifステートメントに一致する単語ではなく、すべての単語の最初のインデックスが常に出力されます。

void wordpro(string sent)
{
  string word;

  istringstream iss(sent, istringstream::in);
  while (iss>> word)
  if (word[0] == 'a'||'e'||'i'||'o'||'u'||'A'||'E'||'I'||'O'||'U')
  {
    cout<< word[0] <<endl;
    }
}
4

2 に答える 2

10
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)

最短です!


ドキュメントを読んで、それぞれが実際に何をするのか、そしてなぜそれがあなたのケースで機能するのかを理解してください:

お役に立てば幸いです。

于 2013-01-27T15:19:48.323 に答える
0

上記の多数の使用の提案はword[0] == 'a' || word[0] == 'e' || ...、単一の if ステートメントから期待されることを行う方法で記述したものを「修正」するための正しい解決策です。

あなたはこれを行うことができます:

 switch(word[0])
 {
    case 'a':
    case 'e':
    case 'i':
    ... /// you'll have to fill the rest in yourself. 
        cout << word[0]; 
        break; 
 } 

または、昔ながらの C スタイルを使用できますstrchr

if (strchr("aeiouAEIOU", word[0]) != NULL)
{
    cout << word[0];
}

おそらく他のソリューションも半ダースあります。それはすべて、あなたが好む「スタイル」に依存します。私はおそらく最初の選択肢としてスイッチを選ぶでしょう。

于 2013-01-27T15:26:22.647 に答える