2016-12-25 111 views
0

我需要幫助調試我的代碼。我嘗試了很多東西,但我似乎無法從字符串中刪除字符。如何從C++中的字符串中刪除字符?

我也不完全瞭解std :: erase是如何工作的,我不確定你是否可以用它擦除字符。

#include <iostream> 
#include <string> 

using namespace std; 
int main(){ 

    string s; 
    char n; 
    cin >> s; 
    cin >> n; 

    for (int i = 0;i < s.length(); i++) { 
     s.erase (n[i]); 
    } 

    cout << s; 

    return 0; 

} 

編輯:對不起,如此含糊。我認識到我試圖從數組中刪除某些東西的問題,而不是預期的字符串。在發佈的答案的幫助下;更新後的代碼附在下面,它以我希望的方式工作。謝謝您的反饋!

#include <iostream> 
#include <string> 

using namespace std; 
int main(){ 

string s; 
char n; 
cin >> s; 
cin >> n; 

for (int i = 0; i < s.length(); i++) { 
    while (s[i] == n) { 
     s.erase(i, i); 
    } 
} 

cout << s; 

return 0; 

} 
+3

什麼是'n [i]'甚至應該是什麼?在這段代碼中沒有任何意義,我不知道你希望它成爲什麼 – UnholySheep

+0

看起來你想從's'中移除存儲在'n'中的字符。既然'n'和'i'都不是數組,'n [i]'表達式似乎是非法的。成員'erase()'從一個位置刪除具有給定長度的字符(默認情況下直到字符串的末尾)。如果你確實想從's'中刪除'n'的實例,你應該看看'std :: remove()'。 –

+0

該代碼[不編譯](https://ideone.com/3M01b4)。請發佈[mcve]。 –

回答

0

如果您包含對您正在嘗試執行的操作的正確描述,這將會很有幫助。這個問題有點含糊,但我認爲你試圖從一個字符串中移除一個給定的字符串,如果這就是你想要做的,這裏是一個工作的例子,它建立在你已經提供的基礎上。

#include <iostream> 
#include <string> 

using namespace std; 
int main(){ 

    string s; 
    char n ; 

    cin >> s; 
    cin >> n; 
    for (int i = 0; i < s.length(); i++) { 
     if (s[i] == n) { 

      s.erase(i, 1); 

     }   
    } 

    cout << s; 

    return 0; 

} 
+1

's.length() - 1'應該是's.length()' –

3

使用erase-remove idiom

#include <iostream> 
#include <string> 
#include <algorithm> 

int main() { 

    std::string s = "Hello World!"; 
    s.erase(std::remove(s.begin(), s.end(), 'l', s.end()); 
    std::cout << s << std::endl; 
    return 0; 
} 

分爲兩個語句這將是:

#include <iostream> 
#include <string> 
#include <algorithm> 

int main() { 

    std::string s = "Hello World!"; 
    auto it = std::remove(s.begin(), s.end(), 'l'); 
    s.erase(it, s.end()); 
    std::cout << s << std::endl; 
    return 0; 
} 
1

如果你只想從你可以使用字符串中刪除一個字符的方法find找到字符串中的字符。例如

auto pos = s.find(n); 
if (pos != std::string::npos) s.erase(pos, 1); 

或者你可以使用一個循環通過以下方式

std::string::size_type pos = 0; 

while (pos < s.size() && s[pos] != n) ++pos; 

if (pos != s.size()) s.erase(pos, 1); 

如果你想使用一個循環來消除字符串中的字符的所有出現,你可以寫

for (std::string::size_type pos = 0; pos < s.size();) 
{ 
    if (s[pos] == n) s.erase(pos, 1); 
    else ++pos; 
} 
+1

請注意,這些解決方案都具有最差的二次方複雜性!由於這種方法的複雜性非常高,所以使用'std ::: remove()'和's.erase()'會更好。 –

+1

@DietmarKühl我相信問題的作者會學習如何在字符串和類方法中使用循環。他對標準算法一無所知。 –