У меня возникли проблемы с этим проклятым экзаменационным вопросом, который я не могу записать, 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;
}
Ваше приложение вылетает из-за того, что инструкция ниже не выделяет никаких элементов 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());
}
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];
не могли бы вы попробовать использовать string.erase ()?
http://www.cplusplus.com/reference/string/string/erase/
Версия итератора позволит вам удалить символ … поиск по строке с использованием итератора, а затем удалить его с помощью функции стирания, которая принимает итератор в качестве аргумента
РЕДАКТИРОВАТЬ: Смотрите ответ Билца … очень приятно!
Когда вы используете 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
Я бы посоветовал;
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';
что является ошибкой вне диапазона.