为什么程序显示字符串超出范围?

时间:2019-03-31 01:07:09

标签: c++ string c++11

我正在做有关从字符串中删除一些单词的作业。它总是显示字符串超出范围,并且我不知道我的代码出了什么问题。

有一些我用来测试功能的字符串:

  • “房子旋转了两三圈,然后慢慢升起来”
  • “空中飞舞。多萝西觉得自己好像是在气球上上升。”
  • “南北风碰到了房屋所在的地方,成为了房屋”
  • “精确的旋风中心”。

以下是我必须从上述字符串中删除的单词:

  • a
  • 一个
  • A
  • The
  • the
  • of

该程序在前两行中运行良好,但表明它在第三行中超出范围,我认为这是因为我必须从第三行中删除最后一个单词(即“ the”)。

int RemoveWordFromLine(string &line, string word)
{
  int no_of_occurence=0;
  int const length_of_stopword=word.length();
 int  const length_of_line=line.length();

 for(int j=0 ;j<=length_of_line-length_of_stopword;j++){

   if (j==0){
   if(line.substr(j,length_of_stopword)==word){

       line.replace(j,length_of_stopword," ");
       no_of_occurence++;
  }
}
if ((j-1>=0) && (j+length_of_stopword<length_of_line)){
  if ((line.substr(j-1,1)==" ") && (line.substr(j+length_of_stopword,1)==" ")){//I have to check this to ensure 'a' in "air" is not removed by the function.
    if(line.substr(j,length_of_stopword)==word){

      line.replace(j,length_of_stopword," ");
      no_of_occurence++;
 }

  }
}

2 个答案:

答案 0 :(得分:2)

删除单词时,字符串的长度减小。但是您仍在循环到字符串的原始长度。一个简单的解决方法是摆脱length_of_line,仅在需要长度的地方调用line.length()

答案 1 :(得分:0)

作为answer from David explained,您需要动态检查line.length(),以考虑行字符串的转换。这解释了超出范围。

尽管如此,这里还有另外两个问题。

第一个是停用词在行末没有空格的情况下。目前将错过这种情况。

第二种情况是当一行以停用词的字符序列开头但以空格以外的其他内容继续(例如“ Then”而不是“ The”)时。在这种情况下,当前会进行替换,而实际上不会。

您可以解决以下两个问题:

for(int j=0 ;j<=line.length()-length_of_stopword;j++){
    if ( j+length_of_stopword<=line.length()){
        if ((j==0 || line[j-1]==' ') && (j+length_of_stopword==line.length() 
           || line[j+length_of_stopword]==' ' ) ) {
            if(line.substr(j,length_of_stopword)==word){
                line.replace(j,length_of_stopword,"*");
                no_of_occurence++;
            }
        }
    }
}

Online demo