0

我无法解决这个我无法放下的爆炸性考试问题,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;
}
4

5 回答 5

2

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

string temp;

如果要temp在 removeChar 函数内部使用,更好的方法是将 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());
}
于 2013-04-29T07:35:04.653 回答
1

resize temp使用前

string temp;

temp.resize(inStringP.size());

当您一开始不知道实际尺寸时,您可以append,push_backoperator+=:

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

or

temp.push_back(inStringP[i]);

or

temp += inStringP[i];
于 2013-04-29T07:31:27.410 回答
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

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

此外,string.length()返回字符串的长度,不包括\0

于 2013-04-29T07:52:38.990 回答
0

您可以尝试使用 string.erase() 吗?

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

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

编辑:见 billz 的回答......非常好!

于 2013-04-29T07:35:12.993 回答
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';

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

于 2013-04-29T07:50:13.240 回答