首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >擦除字符串中的单词(在C++中)

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

Stack Overflow用户
提问于 2016-05-09 05:51:04
回答 5查看 116关注 0票数 0

我想从字符串中删除一些单词,但我的代码无法工作。我没有任何错误或警告,但我认为我的字符串变成了空的。有人能帮我一下吗?我试着将我的初始字符串转换成2个向量,这样我就可以更容易地导航

代码语言:javascript
复制
 #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];


    }
EN

回答 5

Stack Overflow用户

发布于 2016-05-09 06:21:56

警告:这真的只是一个太长的注释,无法放入注释字段中。哦,还有点大惊小怪的。

我很高兴我们有了这些现代语言,让生活变得比几十年前容易得多。例如,考虑一下这个工作看起来是什么样子的SNOBOL 4编程语言:

代码语言:javascript
复制
    s = 'somewhere down the road'
del s 'down' =                     :s(del)
    OUTPUT = s

天哪,我们已经取得了如此大的进步,以至于我们不必处理整整3行代码,现在我们只需52行代码就可以完成这项工作,这真是太好了(哦,除了这52行代码实际上并不起作用,但我们暂时忽略这一点)。

我想,公平地说,我们可以在C++中更简洁地完成这项工作。一种明显的方式是使用std::remove_copy、一些流迭代器和一两个字符串流:

代码语言:javascript
复制
std::istringstream input("somewhere down the road");
std::string del_str("down");

std::istream_iterator<std::string> in(input), end;

std::ostringstream result;

std::remove_copy(in, end, std::ostream_iterator<std::string>(result, " "), del_str);

std::cout << result.str();
票数 3
EN

Stack Overflow用户

发布于 2016-05-09 06:06:33

转换成向量没有任何好处--字符串本身已经提供了你想要做的所有事情。不管怎样,这样做:

代码语言:javascript
复制
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

现在它变得简单了:

代码语言:javascript
复制
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."),但是您也没有这样做……

票数 1
EN

Stack Overflow用户

发布于 2016-05-09 06:03:38

第一个问题是,如果只使用起始位置调用std::string::erase,它将擦除字符串末尾之前的所有内容。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37105202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档