2013-04-29 98 views
0

我遇到了这个抨击的问题,我不能放下,Visual C++ 2010不断告诉我:“表达式:字符串下标超出范围”的问题。我认为我运行的循环比“inStringP.length()”的长度长,因此我添加了&从for循环的条件测试中的整数中减去1或2,但这不会导致成功。谷歌是不是感觉其一贯的天才自今天要么.....字符串下标超出范围(C++)

#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; 
} 

回答

1

resizetemp使用

string temp; 

temp.resize(inStringP.size()); 

之前,当你不知道在开始实际大小,你可以appendpush_backoperator+=

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

or 

temp.push_back(inStringP[i]); 

or 

temp += inStringP[i]; 
+1

我不知道为什么,这已经downvoted?如果你通过元素访问它,或者编译器不知道它有多大,那么字符串temp需要被赋予一定的大小。当你说temp [i] = inStringP [i]时,temp [i]可能超出界限? – FreudianSlip 2013-04-29 07:37:34

+0

谢谢大家的最佳答案,但我得走了“temp.resize ....”,第一次工作,再次感谢和该死的快速反应! – 420kscott 2013-04-29 07:48:20

2

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

string temp; 

如果你想使用temp removeChar功能里面,更好的办法是const引用传递给inStringP

string removeChar(const string& inStringP){ 
} 

通过这样做,你不需要做副本inStringP时输入removeChar函数。

更好的方法是按照erase-remove idiom

尝试:

string removeChar(string inStringP) 
{ 
    return inStringP.erase(std::remove(sample.begin(), sample.end(), 'p'), sample.end()); 
} 
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'; 

这是超出范围的错误。

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你的代码没有给出任何错误。然而,它在for循环的末尾给 一个空的temp;

有了,编译器还没有一个尺寸temp

此外,如果使用相同的itempinStringP 假设,我们在性格e将跳过if block和+1 itemp中相应的 位置将保持不变。

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