下面是我尝试用来从字符串中删除(,
)的一段代码。但我发现当一个以上的有关字符并排存在时会出现问题。
#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,
答案 0 :(得分:6)
您必须有条件地增加索引。查看ff,,f
s[0]
是f
s[1]
是f
s[2]
是,
- &gt;删除,
s
为ff,f
而s[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;
}
}
答案 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;
}
上面的代码无需编写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;
}
}