2010-10-06 130 views
1

我有以下代码这段代码有什么问题?

#include <iostream> 
#include <string> 
using namespace std; 
string replace(string s){ 

    for (int i=0;i<s.length();i++){ 
     if (s[i]> 'b' && s[i]<'f'){ 
      s.erase(s[i]); 

     } 

    } 
    return s; 
} 
int main(){ 

    string s; 
    cin>>s; 
    cout<<replace(s)<<endl; 


    return 0; 

} 

,如果我进入格鲁吉亚它让我异常“中止被称为”为什么?

+0

什么ereOn说,你也有一个bug。如果你有例如“cca”,只有第一个c将被删除。 – 2010-10-06 09:31:02

+0

@Pasi Savolainen:如果你在他的代码中输入“cca”,它会调用未定义的行为。 – ereOn 2010-10-06 09:40:02

回答

6

std::string::erase()需要一个索引对或迭代器。

看看this link

这里s[i]给出一个字符,它被错误地转换为size_t所以,根据你的字符串,你基本上试图删除一个不存在的元素。

一个清洁的解决办法是:

#include <string> 
#include <iostream> 
#include <cstdlib> 

bool should_be_removed(char c) { return (c > 'b') && (c < 'f'); } 

int main() 
{ 
    std::string s; 
    std::cin >> s; 
    s.erase(std::remove_if(s.begin(), s.end(), should_be_removed), s.end()); 

    return EXIT_SUCCESS; 
} 
+0

不错的解决方案,但不应该'remove_if'被称为'分区'或其他东西,因为它实际上并没有删除任何螺母,只是稍稍移动了一些东西。尽管这个名字可能有很好的理由。 – Skizz 2010-10-06 09:57:02

+1

@Skizz:它不会移动“移除”元素,它只是移动不匹配的元素。由'remove_if'返回的迭代器之后的元素值是未定义的。 – ereOn 2010-10-06 10:43:02

+0

是的,你是对的。我必须仔细阅读“remove_if”的规范。 – Skizz 2010-10-06 12:48:47