indexoutofboundsexception — Строковый индекс вне диапазона (C ++)

У меня возникли проблемы с этим проклятым экзаменационным вопросом, который я не могу записать, Visual C ++ 2010 постоянно говорит мне: «Выражение: строковый индекс вне диапазона». Я подумал, что я запускаю цикл длиннее, чем длина «inStringP.length ()», поэтому я добавил & вычтите 1 или 2 из целого числа в условном тесте цикла for, но это не приведет к успеху. Google сегодня тоже не чувствует себя обычным гением …..

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

0

Решение

Ваше приложение вылетает из-за того, что инструкция ниже не выделяет никаких элементов temp, доступ к temp[0] является неопределенное поведение.

string temp;

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

string removeChar(const string& inStringP){
}

Делая это, вам не нужно делать копию в inStringP при входе в функцию removeChar.

Лучший способ — следовать стереть-удалить идиому:

Пытаться:

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

Другие решения

resize temp Перед использованием

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

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

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

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

РЕДАКТИРОВАТЬ: Смотрите ответ Билца … очень приятно!

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

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

Также, string.length() возвращает длину строки, исключая \0

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
По вопросам рекламы [email protected]