2014-11-13 2 views
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 вызывается после выбрасывания экземпляр 'станд :: out_of_range' что(): basic_string :: удалить

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

ответ

1

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

" foo" 

вы в основном говорят:

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

или

classes.erase(32, 102); 

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

Try:

classes.erase(0, i); 
+0

Спасибо! Это было именно то, что было неправильно. По какой-то причине я думал, что должен указать, какую строку символов внутри скобки. Потрясающие! Хорошего вечера! – panjandrums

0

Ваше решение должно выглядеть как:

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

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

+0

Да, вы, ребята, ударили ноготь по голове! Это было именно то, чего не хватало! Спасибо!! – panjandrums

+0

Добро пожаловать. Если мой ответ поможет, попробуйте также проголосовать за него (я знаю, что Пол ответил на фактический вопрос, и я только дал возможное решение). – St0fF

+0

Я пробовал проголосовать, но мне нужно сначала заработать репутацию! Если я достиг 15 репутации, я буду уверен, чтобы начать голосовать за вас! – panjandrums

0

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

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

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

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

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

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

Там также юникода, но это совершенно другая может червей для другого времени.

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