删除字符串中的单词(在C ++中)

时间:2016-05-08 21:51:04

标签: c++

我想从字符串中删除一些单词但我的代码不起作用。我没有任何错误或警告,但我认为我的字符串变空了。有人可以帮我吗?我试图将我的初始字符串转换为2个向量,以便我可以更轻松地导航

 #include <iostream>
    #include <sstream>
    #include <string>
    #include <vector>

    using namespace std;

    int main()
    {
        string s("Somewhere down the road");
        string t("down");
        istringstream iss(s);
        vector <string> plm;
        vector <string> plm2;


        do
        {
            string sub;
            iss >> sub;
            plm.push_back(sub);

        } while (iss);


    for(unsigned int i=0 ; i<plm.size();i++){
    cout<<plm[i];}


        istringstream ist(t);


        do
        {
            string subb;
            ist >> subb;
            plm2.push_back(subb);

        } while (ist);


    for(int i=0;i<plm.size();i++){
    for(int j=0;j<plm2.size();i++){
    {if (plm[i]==plm2[j])
        plm.erase(plm.begin()+j);}}}


    for(int i=0 ; i<plm.size();i++)
    cout<<plm[i];


    }

5 个答案:

答案 0 :(得分:3)

警告:这实际上只是一个评论太长而无法放入评论字段。哦,还有点咆哮。

我很高兴我们拥有这些现代语言,让生活变得比几十年前容易得多。例如,考虑一下这项工作看起来像是一种长期以来垂死的SNOBOL 4编程语言:

 <script type="text/javascript">             
    document.getElementById("click").onclick = function(){
        var hoursOne = parseFloat(document.getElementById("one").value);
        alert(hoursOne);    
    }
 </script>

上帝,很高兴我们已经取得了如此大的进步,以至于我们不需要处理3行代码,我们现在可以只用52行来代替(哦,除了52行)线条实际上不起作用,但暂时忽略它。)

我想,公平地说,我们可以在C ++中更紧凑地完成工作。一个显而易见的方法是使用 s = 'somewhere down the road' del s 'down' = :s(del) OUTPUT = s ,一些流迭代器和一个或两个字符串流:

std::remove_copy

答案 1 :(得分:1)

转换为向量没有任何好处 - 字符串本身已经提供了您想要做的所有必要的事情。无论如何,这样做:

vector<char> v;
v.assign(s.c_str(), s.c_str() + s.length()); // without... 
v.assign(s.c_str(), s.c_str() + s.length() + ); // including...
    // ... terminating null character

现在变得容易了:

size_t pos = s.find(t);
if(pos != string::npos)
{
    s.erase(pos, t.length());
}

但是,这并不关心是否留下多个空格或者如果t不是s中的整个单词(例如t = "down"; s = "I'm going to downtown.";会导致s == "I'm going to town."),但你也没有这样做。

答案 2 :(得分:0)

第一个问题是,如果仅在起始位置调用std::string::erase,它会删除所有内容直到字符串结束。

第二个问题是,代码将只删除第二个字符串中的所有字母,一个接一个。即不是整个单词 - 为此,你需要检查整个单词是否匹配,然后才擦除(单词的整个长度)。问问自己 - 代码中会发生什么,例如前两个字母会匹配,但不是其他字母?

答案 3 :(得分:0)

在您的第二个for循环中,您永远不会增加j并在if (plm[i]==plm2[j])块内使用j而不是i作为{{1 }}

erase()

另一件事是不使用for(int i=0;i<plm.size();i++) { for(int j=0;j<plm2.size();j++)//here you need to increment j { if (plm[i]==plm2[j]) plm.erase(plm.begin()+i);//here the offset should be i } } 循环从do...while读取并推回向量。如果读取失败,您将无效数据推送到向量,而是尝试类似:

stringstream

答案 4 :(得分:-1)

你没有增加j这是我在代码中看到的第一件事。如果它仍然无法正常写,那么请问!