如何将string.erase()与指针一起使用?

时间:2018-09-25 07:32:38

标签: c++ string

从一个更复杂的程序简化了代码,但是在这种更加简化的情况下,我仍然面临着问题。

所以我试图通过使用指针从字符串中删除字符:

string str = "Hellxo World";
char *eraseHere;
for(int i = 0; i < str.length(); i++) {
    if (str[i] == 'x') {
        eraseHere = &str[i];
        str.erase(*eraseHere);
    }
}

我期望str成为Hello World,但是相反,它给出了out_of_range异常并停止了程序。

不擦除这里是否有指向字符“ x”的指针?我在printf中使用了aserHere尝试测试出了什么问题:

printf("%c\n",*eraseHere);

但是它可以完美打印该字符。

谢谢。

2 个答案:

答案 0 :(得分:3)

string类不支持使用指针擦除,因此您不能这样做。

您可以使用 iterator 进行擦除,这几乎是同一件事

for (auto i = str.begin(); i != str.end(); ) {
    if (*i == 'x')
        i = str.erase(i);
    else
        ++i;
}

即使,即使它起作用,您的代码也有一个常见的新手错误,即您忽略了擦除字符时字符串变短的问题。因此,在擦除字符后执行i++是不正确的,因为您将在刚删除的'x'之后跳过字符。

答案 1 :(得分:0)

您可以简单地存储“ x”的索引,然后在循环结束后将其删除...或者您可以在上述答案中使用 iterator

string str = "Hellxo World";
char *eraseHere;
int indx=-1;
for(int i = 0; i < str.length(); i++) 
{
    if (str[i] == 'x') 
    {
        eraseHere = &str[i];
        indx=i;
    }
}
indx!=-1 ? (str.erase(indx,1)):str;
cout<<str<<endl;