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

Why isn't every comma character tackled in the code?

本文关键字:字符 处理 代码 为什么      更新时间:2023-10-16

下面是我试图用来从字符串中删除( ,(的代码。但是我发现,有一个以上有关的炭是并排的,这是一个问题。

#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,

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

  • s[0]f
  • s[1]f
  • s[2],->删除,
  • 现在sff,fs[3]f,但s[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;
    }
}

如果您的目标是用字符串擦除所有逗号,那么最简单的方法是使用std ::从<algorithm>标头中删除。

#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;
}

实例示例

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

remove算法实际上并未删除项目,而是将其移至容器的末端,从而将迭代器返回到"删除"项目的开头。要求erase在容器末端对元素进行最终删除。

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

这对于任何"通过收集进行迭代,检查每个项目并在必要时删除"类型的东西可能是一个很好的模式。

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