你如何使用string.erase和string.find?

时间:2011-03-15 09:50:48

标签: c++ string

为什么我不能在string.erase中调用string.find,如下所示:str.erase(str.find(a[1]),str.size())? 编辑:添加代码

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

// html tags
string tags[5]={"<!--...-->","<!DOCTYPE>","<a>","<abbr>","<acronym>"};
//

//check if string exists
int boolStringExists(string a, string b)
{
    if(a.find(b)>0)
    {
        return 1;
    }
    if(a.find(b)<=0)
    {
        return 0;
    }

}
//erase tag from string a
void eraseTags(string a,string b[])
{

    for(int i=0; i<5;i++)
    {
        int x=(boolStringExists(a,b[i]));
        while (x>0)
        {
            a.erase(a.find(b[i]),b[i].size());
            x=(boolStringExists(a,b[i]));
        }
    }
}
int _tmain(int argc, _TCHAR* argv[])
{    
    fstream file;
    file.open("h:\\a.htm");
    string k,m;



    while(getline(file, k))
        m += k ;


    eraseTags(m,tags);


    return 0;
}

给出此消息:“此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”

3 个答案:

答案 0 :(得分:3)

如果找不到该字符串,find将返回string::npos,然后您的代码将无法运行并将产生运行时错误。看到此错误:https://ideone.com/NEhqn

所以写得更好:

size_t pos = str.find(a[1]);
if ( pos != std::string::npos)
   str.erase(pos); //str.size() is not needed!

现在这不会出错:https://ideone.com/IF2Hy

答案 1 :(得分:1)

该通话没有问题(假设存在a[1]且至少在str找到一次)

#include <iostream>
#include <string>
int main()
{
        std::string str = "Hello, world!";
        std::string a = "wwwwww";
        str.erase(str.find(a[1]), str.size());
        std::cout << str << '\n';
}

测试运行:https://ideone.com/8wibR

编辑:您的完整源代码无法检查b[1]中是否确实找到str。如果boolStringExists()大于零,则函数1会返回a.find(b),而std::string::npos中找不到b时返回的a的值//check if string exists bool boolStringExists(string a, string b) { return a.find(b) != string::npos; } 大于零。

要在保持逻辑的其余部分完整的同时修复此问题,请将该功能更改为

{{1}}

答案 2 :(得分:1)

似乎你想要删除str.find(a [1])之后的所有内容。在这种情况下,您可以省略第二个参数。

#include <iostream>
#include <string>

int main(int argc, char *argv[]) {
        std::string str = "Hello, world!";
        std::string needle = "o,";
        str.erase(str.find(needle));
        std::cout << str << "\n";
}

在此示例中,我使用了needle而不是a[1],但原则是相同的。