Я пытаюсь обрезать пробел с передней части моей строки (классов). По какой-то причине каждый раз, когда я запускаю код, я получаю сообщение об ошибке, и я понятия не имею, как его исправить.
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
Я все еще очень новичок в кодировании, поэтому, возможно, намек в правильном направлении вместо ответа, чтобы я мог учиться на своих ошибках.
erase()
принимает начальную позицию и длину. То есть числа. Вы передаете персонажей в этих точках. Итак, если строка:
" foo"
вы в основном говорите:
classes.erase(' ', 'f');
или
classes.erase(32, 102);
которые, безусловно, вне диапазона вашей 5-символьной строки.
Пытаться:
classes.erase(0, i);
Я немного опаздываю на это, но вы можете сделать это, не выполняя итерацию самостоятельно, просто делая что-то вроде этого:
classes.erase(0, classes.find_first_not_of(' '));
Это будет отлично работать при пустых строках и строках с ведущими пробелами, поэтому дополнительная проверка не требуется. Как правило, хорошей практикой является использование стандартных библиотечных функций, особенно когда они делают ваш код немного короче и, возможно, еще более удобочитаемым.
Я не уверен, но я думаю, что другие методы, используемые здесь (неоднократно стирающие первый символ), заставляют базовый буфер строк повторно копироваться и/или перераспределяться, поэтому этот способ может быть немного более эффективным.
Кроме того, возможно, стоит подумать о том, что существует более одного вида пробелов, таких как вкладки. find_first_not_of
может делать такие вещи, как это:
classes.erase(0, classes.find_first_not_of(" \t"));
Там также unicode, но это еще одна возможность червей в другое время.
Ваше решение должно выглядеть по-другому:
int i(0);
while((i < classes.length()) && (classes[i] == ' ')) ++i;
classes.erase(0,i);
@Paul Roub объяснил это очень хорошо, уже.