2016-07-25 3 views
-5

Учитывая этот код:Почему строка :: substr Misbehaving?

auto str = "a,b,c"s; 
vector<string> tokens; 
string::size_type start = -1; 
string::size_type finish = str.find(','); 

do { 
    tokens.push_back(str.substr(start + 1, finish)); 
    start = finish; 
    finish = str.find(',', start + 1); 
} while (start != string::npos); 

Я бы ожидать tokens содержать:

  1. "а"
  2. "б"
  3. "с"

Когда я бегу код, однако я получаю:

  1. «а»
  2. «б, в»
  3. «с»

Я распечатал информацию об отладке в этом живом примере: http://ideone.com/fx3uC9

Является ли это ошибка? Я вижу это в gcc и Visual Studio, поэтому кажется, что я сделал что-то неправильно.

+2

Для этого нужен отладчик. Это очень короткий, простой, тривиальный алгоритм. Используйте свой отладчик для перехода по коду, по одной строке за раз, каждый раз через цикл. Изучите значения всех этих переменных. Посмотрите, на что они указывают. Прочтите описание методов 'std :: string' и каждого параметра. Объясните это. Знание того, как использовать отладчик, является обязательным навыком для каждого разработчика C++. –

+5

Второй аргумент 'substr()' является * длиной *, а не индексом. –

+0

Возможный дубликат вопроса, заданного в прошлую эпоху, когда вопросы были поддержаны: http://stackoverflow.com/q/12827030/2642059 –

ответ

3

Если вы читаете документацию для substr(), подпись:

basic_string substr(size_type pos = 0, 
        size_type count = npos) const; 

Второй аргумент не позиция конца (как и любой другой функции в <algorithm>, которая принимает диапазон), это длина подстрока. Итак, где у вас есть finish в качестве конца, вам нужно finish - (start + 1) как длину.

+1

tl; dr blah blah ** прочитать документацию для substr() ** blah blah;) –

+1

@JonathanWakely Это приятный выход из джунглей, который является документацией. – Barry

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

  • Нет связанных вопросов^_^