2016-12-25 46 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我相信问题的作者会学习如何在字符串和类方法中使用循环。他对标准算法一无所知。 –