2013-04-29 2 views
0

У меня возникли проблемы с этим экзаменационным вопросом, который я не могу записать, Visual C++ 2010 продолжает говорить мне: «Выражение: строковый индекс вне диапазона». Я решил, что я выполняю цикл длиннее, чем длина «inStringP.length()», поэтому я добавил & вычитал 1 или 2 из целого числа в условном тесте for loop, но это не приводит к успеху. Google не чувствует свой обычный гений себя сегодня либо .....Строковый индекс вне диапазона (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()); 

Если вы не знаете, реальный размер в начале, вы можете append , push_back и operator+=:

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

+0

Спасибо всем за отличные ответы, но я должен пойти с «temp.resize ....», работал в первый раз, снова спасибо и проклял БЫСТРОГО ответа! – 420kscott

2

ваших аварий приложений, потому что ниже утверждение не выделяет каких-либо элементов для temp, обращение к temp[0]: не определено поведение.

string temp; 

Если вы хотите использовать temp внутри функции removeChar, лучший способ, чтобы передать константную ссылку inStringP

string removeChar(const string& inStringP){ 
} 

Делая это, вам не нужно, чтобы сделать копию inStringP когда это введите функцию removeChar.

Лучший способ это следовать erase-remove idiom:

Try:

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

могли бы вы попробовать использовать string.erase()?

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

версия итератора позволит вам удалить символ ... поиск в строке с помощью итератора, а затем удалить его с помощью функции стирания, которая принимает итератор в качестве аргумента

EDIT: Смотрите ответ Билза ... очень приятно!

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 это не дает никакой ошибки.Однако он дал пробел temp в конце for петля;

С, компилятор еще не имеет размер для temp

Кроме того, если вы используете тот же i для temp и inStringP Предположим, что мы на характер e он пропустит if block и +1 i , Соответствующее положение в temp останется таким, каким оно есть.

Кроме того, string.length() возвращает длину строки без учета \0

Смежные вопросы