C++ 为什么不是';代码中不是每个逗号字符都处理吗?
下面是我试图用来从字符串中删除(C++ 为什么不是';代码中不是每个逗号字符都处理吗?,c++,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&l
,
)的一段代码。但我发现,当不止一个相关字符并排出现时,就会出现一个问题
#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
iss[0]
f
iss[1]
f
是s[2]
->删除,
,
- 现在
是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;
}
}
for(int i=0;i cout如果您的目标是删除字符串中的所有逗号,那么最简单的方法就是使用
上述代码消除了写入for
循环并一次擦除字符的需要。当前使用for
循环并一次擦除单个逗号字符的方法不如上述代码有效
remove
算法实际上并不删除项,而是将它们移动到容器的末尾,从而将迭代器返回到“删除”的项的开头。调用擦除
来最终删除容器末尾的元素。另一个选项是向后遍历字符串,这样就不需要条件迭代,因为要检查的其余部分不会移动
对于任何“遍历集合、检查每个项并在必要时删除”类型的东西,这都是一种很好的模式
for (int i = s.length()-1; i >=0; i-- ) {
if (s.at(i) == ',') {
s.erase(s.begin() + i);
cout << s << endl;
}
}
for(int i=s.length()-1;i>=0;i--){
如果(s.at(i)=','){
s、 擦除(s.begin()+i);
为什么不简单地使用s.erase(std::remove(s.begin()、s.end()、'、'、s.end())这是因为当你删除一个逗号时,它会将它在字符串中的一个位置前移,但你仍然会增加'i',这意味着它会跳过在删除逗号时替换逗号的字符。所以你的目标是从字符串中删除所有逗号?还是其他什么?哦,好吧,我明白了。我对这些行为不太熟悉ly.谢谢@over(s)@Mathbg--另外,不要这样做:#include
。包括正确的头文件,而不是这个头文件,因为这有各种含义(非标准只是其中之一).我明白了,cppreference似乎很适合快速引用函数,我在帖子中提到的函数失败时就这么做了。无论如何,谢谢:)
#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 (int i = s.length()-1; i >=0; i-- ) {
if (s.at(i) == ',') {
s.erase(s.begin() + i);
cout << s << endl;
}
}