为什么代码中没有处理每个逗号字符?

时间:2018-02-21 17:10:32

标签: c++

下面是我尝试用来从字符串中删除(,)的一段代码。但我发现当一个以上的有关字符并排存在时会出现问题。

#include <bits/stdc++.h>
using namespace std;
int main()
{
string s; cin >>s;
for (int i=0; i<=s.length()-1; i++)
    if (s.at(i)==',')
        {s.erase(s.begin()+i); cout<<s<<endl;}
cout<<s;
return 0;
}

请注意,我在每次操作后都产生了结果字符串,因此更容易理解。

以下是连续放置多个(,)时的输出:

ff,,f,,ffff,,,,ff,f,f.,fwer..ew,,,
ff,f,,ffff,,,,ff,f,f.,fwer..ew,,,
ff,f,ffff,,,,ff,f,f.,fwer..ew,,,
ff,f,ffff,,,ff,f,f.,fwer..ew,,,
ff,f,ffff,,ff,f,f.,fwer..ew,,,
ff,f,ffff,,fff,f.,fwer..ew,,,
ff,f,ffff,,ffff.,fwer..ew,,,
ff,f,ffff,,ffff.fwer..ew,,,
ff,f,ffff,,ffff.fwer..ew,,
ff,f,ffff,,ffff.fwer..ew,
ff,f,ffff,,ffff.fwer..ew,

3 个答案:

答案 0 :(得分:6)

您必须有条件地增加索引。查看ff,,f

  • s[0]f
  • s[1]f
  • s[2], - &gt;删除,
  • 现在sff,fs[3]fs[2],

要解决此问题,您必须仅在当前字符 ,时增加索引。

for (int i = 0; i < s.length(); ) {
    if (s.at(i) == ',') {
        s.erase(s.begin() + i);
        cout << s << endl;
    } else {
        // current character is not ','
        ++i;
    }
}

答案 1 :(得分:5)

如果您的目标是删除字符串中的所有逗号,最简单的方法是使用<algorithm>标题中的std::remove

#include <algorithm>
#include <string>
#include <iostream>

int main()
{
   std::string s = "This,,,,string,,contains a,,,,lot,of,,commas,,,";
   s.erase(std::remove(s.begin(), s.end(), ','), s.end());
   std::cout << s;
}

Live Example

上面的代码无需编写for循环并一次删除一个字符。您当前使用for循环并一次删除单个逗号字符的方法不如上面的代码有效。

remove算法实际上并没有删除项目,而是将它们移动到容器的末尾,从而将迭代器返回到被删除的项目的开头#34; 。要求erase最后删除容器末尾的元素。

答案 2 :(得分:1)

另一种选择是向后迭代字符串,这样你就不需要条件迭代,因为要检查的其余部分不会移动。

对于任何&#34;迭代收集,检查每个项目并在必要时删除&#34;这可以是一个很好的模式。打字。

for (int i = s.length()-1; i >=0; i-- ) {
    if (s.at(i) == ',') {
        s.erase(s.begin() + i);
        cout << s << endl;
    } 
}