Ошибка вне диапазона с оператором for

0

Я пытаюсь обрезать пробел с передней части моей строки (классов). По какой-то причине каждый раз, когда я запускаю код, я получаю сообщение об ошибке, и я понятия не имею, как его исправить.

void format_classes(string& classes)
{

  int n = classes.length();

  for (int i=0; i<n; i++)
  {
    if(classes[i] != ' ')
    {
        classes.erase(classes[0], classes[i]);
        break;
    }
  }     
}

Приведенный выше код получит что-то вроде " PhySiCS 101 lAB" и я должен вернуть его без пробела.

сообщение об ошибке, которое я получил:

terminate call после вызова экземпляра 'std :: out_of_range' what(): basic_string :: erase

Я все еще очень новичок в кодировании, поэтому, возможно, намек в правильном направлении вместо ответа, чтобы я мог учиться на своих ошибках.

Теги:
string
erase
void

3 ответа

1
Лучший ответ

erase() принимает начальную позицию и длину. То есть числа. Вы передаете персонажей в этих точках. Итак, если строка:

"  foo"

вы в основном говорите:

classes.erase(' ', 'f');

или

classes.erase(32, 102);

которые, безусловно, вне диапазона вашей 5-символьной строки.

Пытаться:

classes.erase(0, i);
  • 0
    Спасибо! Это было именно то, что было не так. По какой-то причине я подумал, что должен был указать, какая строка символов в скобках. Потрясающие! Хорошего вечера!
0

Я немного опаздываю на это, но вы можете сделать это, не выполняя итерацию самостоятельно, просто делая что-то вроде этого:

classes.erase(0, classes.find_first_not_of(' '));

Это будет отлично работать при пустых строках и строках с ведущими пробелами, поэтому дополнительная проверка не требуется. Как правило, хорошей практикой является использование стандартных библиотечных функций, особенно когда они делают ваш код немного короче и, возможно, еще более удобочитаемым.

Я не уверен, но я думаю, что другие методы, используемые здесь (неоднократно стирающие первый символ), заставляют базовый буфер строк повторно копироваться и/или перераспределяться, поэтому этот способ может быть немного более эффективным.

Кроме того, возможно, стоит подумать о том, что существует более одного вида пробелов, таких как вкладки. find_first_not_of может делать такие вещи, как это:

classes.erase(0, classes.find_first_not_of(" \t"));

Там также unicode, но это еще одна возможность червей в другое время.

0

Ваше решение должно выглядеть по-другому:

int i(0);
while((i < classes.length()) && (classes[i] == ' ')) ++i;
classes.erase(0,i);

@Paul Roub объяснил это очень хорошо, уже.

  • 0
    Да, вы, ребята, ударились ногтем по голове! Это было именно то, чего не хватало! Спасибо!!
  • 0
    Пожалуйста. Если мой ответ поможет, пожалуйста, подумайте также, чтобы проголосовать за него (я знаю, что Пол ответил на реальный вопрос, и я только предоставил возможное решение).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню