2010-10-06 124 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