2016-04-18 18 views
3

私はいくつかのコードを書いていて、何か問題を抱えていました。私は、文字列に母音があるかどうかをチェックし、その内部のswitch文を使ってforループを実行しようとする関数を書いたかったのです。明らかに、それはうまくいかず、何らかの理由で真実を返すことはありません。文字列の繰り返しとswitch文:C++

プログラムが実際に文字列を反復していたかどうかをテストしたところ、関数内でなぜ常にfalseを返すのか理解できませんでしたか?

int main() { 
    string userInp; 
    string pigLatin; 

    cout << "Please enter a string to convert to pig Latin: " << endl; 
    cin >> userInp; 
    cout << endl; 

    // tests 
    for (int i = 0; i < userInp.size(); i++) { //checking if it actually iterates 
     cout << userInp[i]; 
    } 
    cout << endl; 

    if (scanStr(userInp)) 
     cout << "it has a vowel" << endl; 
    else 
     cout << "no vowel" << endl; 

    system("pause"); 
    return 0; 
} 

は、最初に私はループが最後のケースの後にbreak文があったにもかかわらず、継続的に保たれているため、それがあったと思ったが、私はそれが理由であれば、完全にはわかりません。

アイデア?

+0

コードが間違っています。あなたのために修正します – tomascapek

+0

ループカウンタ 'i'は' std :: size_t'型でなければなりません。なぜなら、 'userInp.size()'は常に符号付き 'int'に収まるとは限らないからです。 – jotik

+0

また、 'return true;'文の後の 'break;'文はデッドコードであり、決して実行されないことに注意してください。 – jotik

答えて

1

問題があったのは、いずれの文字も母音でない場合、その関数はimediatelly falseを返しました。 const &も使用してください。 constでは、C++が文字列全体をコピーする必要がないため、const文字列と参照の保存に時間を費やすことができます。

bool scanStr(const string & userInp) { 
    for (int i = 0; i < userInp.size(); i++) { 
     switch (userInp[i]) 
     { 
     case 'a': 
     case 'A': 
     case 'e': 
     case 'E': 
     case 'i': 
     case 'I': 
     case 'o': 
     case 'O': 
     case 'u': 
     case 'U': 
     case 'y': 
     case 'Y': 
      return true; 
      break; 
     } 
    } 
    return false; 
} 
+0

私はまだC++を初めて使っていませんので、まだ持っているすべての機能に慣れていません – Panthy

+0

これはCの関数ですが、純粋なものです。それはコードのいくつかの行を余分にするだろう。しかし、definetelly参照を参照してください!あなたがCとポインタに精通しているなら、参照はC++の方法でポインタのようなものです。 – tomascapek

+0

これまでのところ、私が参照を混乱させることのできる最も近いものは&記号ですが、この時点で* thingyは私のために少し複雑に見えました:P – Panthy

5

ドロップあなたの関数からこのライン:

default: 
     return false; 

彼らはそれが遭遇最初非母音であなたの関数の戻り値falseを作ります。

ループのの末尾がに達し、まだtrueが返されていない場合は、falseを返すだけです。現代のC++で

bool scanStr(string userInp) 
{ 
    for (int i = 0; i < userInp.size(); i++) 
    { 
     switch (userInp[i]) 
     { 
     case 'a': 
     case 'A': 
     case 'e': 
     case 'E': 
     case 'i': 
     case 'I': 
     case 'o': 
     case 'O': 
     case 'u': 
     case 'U': 
     case 'y': 
     case 'Y': 
      return true; 
     } 
    } 

    return false; 
} 

より良いアプローチは、次のようになります。

bool scanStr(const std::string& userInp) 
{ 
    for (const auto c : userInp) 
    { 
     switch (c) 
     { 
     case 'a': 
     case 'A': 
     case 'e': 
     case 'E': 
     case 'i': 
     case 'I': 
     case 'o': 
     case 'O': 
     case 'u': 
     case 'U': 
     case 'y': 
     case 'Y': 
      return true; 
     } 
    } 

    return false; 
} 

しかし、あなたはそれが何を意味するのかわからない場合は、今それについて心配しないで、あなたの本やチュートリアルでは十分にすぐに説明します。

+0

私は混乱しています、最初の反復としてHを使用して、文字列 "Hello"があったとしましょう。デフォルトではfalseになりましたが、break文はありません。 ? – Panthy

+1

@Panthyいいえ、いったん関数を終了し、値があればそれが呼び出し側に返されます。 – nvoigt

+0

私は変数bool Xを持っていて、true/falseを返す代わりに、true/falseの値をXに入れ、最後にXをループから返すと仮定します。 – Panthy

13

私はあなたが独自の関数に母音テストのロジックを抽出することを示唆している:

bool is_vowel(char x) 
{ 
    switch (x) 
    { 
    case 'a': 
    case 'A': 
    case 'e': 
    case 'E': 
    case 'i': 
    case 'I': 
    case 'o': 
    case 'O': 
    case 'u': 
    case 'U': 
    case 'y': 
    case 'Y': 
     return true; 
    default: 
     return false; 
    } 
} 

その後、あなたの代わりにループの標準アルゴリズムを使用することができます。

#include <algorithm> 
#include <string> 

bool contains_vowel(const std::string& str) 
{ 
    return std::any_of(str.begin(), str.end(), is_vowel); 
} 

(私はscanStrcontains_vowelに改名しました。なぜなら、その名前ははるかにわかりやすいからです。)

+0

ここでは完璧なことはありませんが、私は理解しています! – Panthy

+2

"文字列内のすべての文字は母音ですか?" 「シーケンス内のすべての要素がいくつかの述語を満たすか」の具体的な例の1つで、C++標準ライブラリはそのためのアルゴリズムを提供しています。 – fredoverflow

+1

は、stdアルゴリズムのデカップリングと使用を促進する唯一の答えです。もっとこのようにしてください、+1 –

0

最初にコンパイラがスイッチケースをルックアップテーブルに変換すると、割り当てられた値(この場合はchar)に基づいて、autoがコンパイラによってデータ型として決定されます。

あなたのコンパイラにそれを与えるだけで、それを行う方法を知っています。

bool scanStr(string userInp) 
{ 
    for(auto c : userInp) 
    { 
     switch (c) 
     { 
      case 'a': case 'A': 
      case 'e': case 'E': 
      case 'i': case 'I': 
      case 'o': case 'O': 
      case 'u': case 'U': 
      case 'y': case 'Y': 

      return true; 
     } 
    } 

    return false; 
} 
関連する問題