2017-09-27 16 views
1

このコードでは、文字列を受け取り、文字列の偶数および奇数の文字をスペースで区切られた2つの別々の文字列として書き出します。私は標準forループを使用して問題を解決しました。しかし、私は、Bjarneの2017 CPPCON基調演説を受けてから、通常のforループの代わりに、範囲ベースのforループを使用しようとしています。通常のforループは正常に動作し、次のコードブロックでコメントしています。C++の範囲ベースforループに関する混乱

問題:コードはg ++ -std = c + 11コマンドでコンパイルされますが、偶数および奇数の文字列が文字化けして出力され、バイナリファイルのように読み込まれます。私が間違ってやっている事や、ここで何が起こっているのかを説明してください。明確な説明は非常に高く評価されます。ありがとうございました。

string S,even,odd; 
    cout << "Enter a string:\n"; 
    cin.ignore(); // So that getline does not catch 
    //the eol character 
    getline(cin,S); 
    // for (int j=0; j<S.length(); j++){ 
    //  if(j==0 || j%2==0){even.push_back(S[j]);} 
    //  else {odd.push_back(S[j]);} 
    // } 
    for (auto j : S){ 
     if(j==0 || j%2==0){even.push_back(S[j]);} 
     else {odd.push_back(S[j]);} 
    } 
    cout << "You wrote: " << S <<'\n'; 
    cout << "Even(including 0) positioned character(s) 
    of " << S << " is(are) " << even <<'\n'; 
    cout << "Odd positioned character(s) of " << S << 
    " is(are) " << odd <<'\n'; 
+2

デバッガを使用してコードをステップ実行する方法が必要なようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:[小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver

+0

@NathanOliverありがとう!ここの答えは非常に参考になります。 – anotherone

+5

forの範囲は、期待どおりに動作しません。実行中のインデックスではなく、コンテナの要素を反復処理します。あなたのケースでは、文字列の実際の文字 –

答えて

1

範囲ベースのforループは、コンテナの要素を反復処理します。あなたのコード中の 'j'は、インデックスではなく文字列内の文字です。これを試してください:

for (auto character : S) 
{ 
    if (even.length() > odd.length()) 
    { 
    odd.push_back(character); 
    } 
    else 
    { 
    even.push_back(character); 
    } 
} 
+0

これは、偶数と奇数の非常に巧妙な実装です。ありがとうございました!はい、私の混乱も明らかになりました。 – anotherone

+0

ようこそ。 –

関連する問題