我打算编写一些程序,它将从文本文件中读取文本并删除给定的单词。
不幸的是,这个特定代码部分出了问题,我得到以下异常通知:
此文本只是一个示例,基于投掷后调用的其他textterminate 'std :: out_of_range'的实例<>:Basic_string_erase
我想我使用擦除的方式有问题,我正在尝试使用执行循环,确定每次循环时要删除的单词的开头完成并最终擦除文本,该文本从要删除的单词的开头开始并结束 - 我正在使用它的长度。
#include <iostream>
#include <string>
using namespace std;
void eraseString(string &str1, string &str2) // str1 - text, str2 - phrase
{
size_t positionOfPhrase = str1.find(str2);
if(positionOfPhrase == string::npos)
{
cout <<"Phrase hasn't been found... at all"<< endl;
}
else
{
do{
positionOfPhrase = str1.find(str2, positionOfPhrase + str2.size());
str1.erase(positionOfPhrase, str2.size());//**IT's PROBABLY THE SOURCE OF PROBLEM**
}while(positionOfPhrase != string::npos);
}
}
int main(void)
{
string str("This text is just a sample text, based on other text");
string str0("text");
cout << str;
eraseString(str, str0);
cout << str;
}
答案 0 :(得分:1)
你的功能错了。完全不清楚为什么你会在方法之后调用方法两次。
请尝试以下代码。
#include <iostream>
#include <string>
std::string & eraseString( std::string &s1, const std::string &s2 )
{
std::string::size_type pos = 0;
while ( ( pos = s1.find( s2, pos ) ) != std::string::npos )
{
s1.erase( pos, s2.size() );
}
return s1;
}
int main()
{
std::string s1( "This text is just a sample text, based on other text" );
std::string s2( "text" );
std::cout << s1 << std::endl;
std::cout << eraseString( s1, s2 ) << std::endl;
return 0;
}
程序输出
This text is just a sample text, based on other text
This is just a sample , based on other
答案 1 :(得分:0)
我认为你的麻烦是do循环中的positionOfPhrase可以是string :: npos,在这种情况下erase会抛出异常。这可以通过将逻辑更改为:
来解决while (true) {
positionOfPhrase = str1.find(str2, positionOfPhrase + str2.size());
if (positionOfPhrase == string::npos) break;
str1.erase(positionOfPhrase, str2.size());
}