字符串下标超出范围(C ++)

时间:2013-04-29 07:30:00

标签: c++ indexoutofboundsexception

我无法解决这个我无法解决的爆破考试问题,Visual C ++ 2010一直告诉我:“表达式:字符串下标超出范围”。我认为我运行的循环时间长于“inStringP.length()”的长度,所以我添加了&从for循环的条件测试中的整数中减去1或2,但这不会成功。谷歌今天也没有感受到它通常的天才......

#include <iostream>
#include <cstdlib>
#include <string>
#include "stdAfx.h"
using namespace std;

string removeChar(string inStringP){
   string temp;
   for(int i=0;i<inStringP.length()-1;i++){
      if(inStringP[i]!='p'){
         temp[i]=inStringP[i];
      }
   }
   return temp;
}

int main(){
   string sample = "Peter picks a peck of pickled peppers";
   cout<<removeChar(sample)<<endl;

   system("PAUSE");
   return EXIT_SUCCESS;
}

5 个答案:

答案 0 :(得分:2)

您的应用程序崩溃是因为下面的语句没有为temp分配任何元素,访问temp[0]未定义的行为

string temp;

如果你想在removeChar函数中使用temp,更好的方法是将const引用传递给inStringP

string removeChar(const string& inStringP){
}

通过这样做,当输入removeChar函数时,您不需要复制到inStringP。

更好的方法是关注erase-remove idiom

尝试:

string removeChar(string inStringP)
{
    return inStringP.erase(std::remove(sample.begin(), sample.end(), 'p'), sample.end());
}

答案 1 :(得分:1)

在使用

之前

resize temp

string temp;

temp.resize(inStringP.size());

如果您不知道开头的实际尺寸,可以appendpush_backoperator+=

temp.append(1, inStringP[i]);

or

temp.push_back(inStringP[i]);

or

temp += inStringP[i];

答案 2 :(得分:0)

你能尝试使用string.erase()吗?

http://www.cplusplus.com/reference/string/string/erase/

迭代器版本将允许您删除一个字符...使用迭代器搜索字符串,然后使用erase函数删除它,该函数接受迭代器作为参数

编辑:看到billz的答案......非常好!

答案 3 :(得分:0)

我会建议;

string removeChar(string inStringP){
   string temp;
   int len = inStringP.length();
   for(int i = 0;i < len;i++){
      if(inStringP[i] != 'p'){
        temp.push_back(inStringP[i]);
      }
   }
   return temp;
}

因为您的逻辑给出了无编译时错误,但它是运行时错误。您的代码实际上用作:

string temp;
    temp[0] = 'P';
    temp[1] = 'e';
    temp[2] = 't';
    temp[3] = 'e';
    temp[4] = 'r';
    temp[5] = ' ';
    //s[6] = 'p';
    temp[7] = 'i';

这是一个超出范围的错误。

答案 4 :(得分:0)

使用std::string时,您也可以使用算术运算符。

你可以这样做,

   for(int i=0;i<=inStringP.length();i++)
   {
      if(inStringP[i]!='p')
      {
         temp += inStringP[i];
         cout<<temp<<endl;
      }
   }

我在g++ 4.6.3上尝试了您的代码,它没有给出任何错误。然而,它给了 temp循环结束时的空白for;

使用temp[i] = inString[i]编译器还没有temp

的大小

此外,如果您对itemp使用相同的inStringP 假设我们处于字符e,它将跳过if block和+1 i。相应的 temp中的位置将保持不变。

此外,string.length()会返回不包含\0

的字符串长度