为什么我不能在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;
}
给出此消息:“此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”
答案 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';
}
编辑:您的完整源代码无法检查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]
,但原则是相同的。