关于C ++中基于范围的for循环的困惑

时间:2017-09-27 16:28:47

标签: c++ c++11 for-loop

此代码接受一个字符串,然后将字符串的偶数和奇数字符写为2个由空格分隔的单独字符串。我已经使用标准for循环解决了这个问题。但是我试图在它中使用基于范围的for循环而不是正常的for循环(在被Bjarne的2017 CPPCON主题演讲激活之后)。正常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';

1 个答案:

答案 0 :(得分:1)

基于范围的for循环遍历容器的元素。代码中的'j'是字符串中的字符,而不是索引。试试这个:

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