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

C++ 为什么程序显示字符串超出范围?,c++,string,c++11,C++,String,C++11,我正在做关于从字符串中删除一些单词的家庭作业。它总是显示字符串超出范围,我不知道我的代码出了什么问题 以下是我用来测试函数的字符串: “房子旋转了两三圈,慢慢地升起” “在空中。多萝西感觉自己就像坐着气球一样。” 北风和南风在房子所在的地方会合,使它成为最美丽的地方 “气旋的确切中心。” 以下是我必须从上述字符串中删除的单词: a 一个 A 及 在 或 的 该程序在前两行运行良好,但它表明它超出了第三行的范围,我认为这是因为我必须删除第三行的最后一个单词(即“The”) int-Re

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

以下是我用来测试函数的字符串:

  • “房子旋转了两三圈,慢慢地升起”
  • “在空中。多萝西感觉自己就像坐着气球一样。”
  • 北风和南风在房子所在的地方会合,使它成为最美丽的地方
  • “气旋的确切中心。”
以下是我必须从上述字符串中删除的单词:

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

int-RemoveWordFromLine(字符串和行,字符串字)
{
int no_of_occurrence=0;
int const length_of_stopword=word.length();
int const length_of_line=line.length();

对于(int j=0;j=0)和&(j+length\u of_stopword来说,当您删除一个单词时,字符串的长度会减少。但是您仍然会循环到字符串的原始长度。一个简单的解决方法是去掉
length\u of_line
并只调用
line.length()
任何需要长度的地方。

作为示例,您需要动态检查
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++;
            }
        }
    }
}

for(int j=0;j你是否用铅笔和纸完成了这道题以检查你的数学?你是否用调试器完成了程序?你发现了什么?寻求调试帮助的问题(“为什么这道代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建.Advice--
行。substr(j-1,1)=“”
--这是检查单个字符是否为空格的最糟糕方法之一。这可能只是
行[j-1]=''
我用铅笔解决了这个问题,但我无法找出字符串超出范围的原因。字符串没有超出范围。这没有意义。字符串索引超出范围。请精确。
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++;
            }
        }
    }
}