Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不是';代码中不是每个逗号字符都处理吗?_C++ - Fatal编程技术网

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

  • s[0]
    is
    f
  • s[1]
    is
    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;icout如果您的目标是删除字符串中的所有逗号,那么最简单的方法就是使用

上述代码消除了写入
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;
    } 
}