String.erase给出out_of_range异常

时间:2014-12-06 10:07:06

标签: c++ string erase

我打算编写一些程序,它将从文本文件中读取文本并删除给定的单词。

不幸的是,这个特定代码部分出了问题,我得到以下异常通知:

此文本只是一个示例,基于投掷后调用的其他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; 

}

2 个答案:

答案 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());
}