Почему вызов std :: getline () n раз на одном входе приводит к n -ному токенизации? - PullRequest
0 голосов
/ 22 декабря 2018

Это дополнительный вопрос к принятому ответу на этот вопрос: C ++ разделить строку на строку

В следующем коде (функция doSegment() цитируется от answerer @billz):

#include <iostream>
#include <sstream>
#include <string>

int doSegment( const char *sentence )
{
  std::stringstream ss(sentence);
  std::string to;

  if (sentence != NULL)
  {
    while(std::getline(ss,to,'\n')){
      std::cout << to << std::endl;
    }
  }

  return 0;
}

int main( int argc, char* argv[] )
{
  std::ostringstream oss;
  oss << "hello\nworld" << std::endl << "my" << std::endl << "name" << std::endl << "is nobody";
  doSegment( oss.str().c_str() );
  return 0;
}

... код ведет себя точно так, как ожидалось: он разбивает входную строку на новые строки

Вопрос: Почему итеративный вызов std::getline()на том же входном аргументе результат в токенизации next , сохраненной в выходном аргументе?Т.е. как std::getline() отслеживает, что он был вызван n раз и нуждается в доставке (n + 1) th токенизации?

Т.е. для сравнения strtok() делает это, передавая NULL в качестве входного аргумента, чтобы он знал, что должен работать со своей статической локальной переменной - но он изменяет свой ввод.Это примерное использование std::getline() не требует передачи NULL в качестве ввода после первой итерации и не изменяет его ввод.

Я пытался прочитать запись std::getline() в cppreference и cplusplus, но они этого не сделалиПохоже, я действительно не отвечаю на этот вопрос, и я уже не нашел этого вопроса здесь.

Благодарен всем, кто может просветить меня, как это работает.

1 Ответ

0 голосов
/ 22 декабря 2018

Если вы не уверены, где хранится состояние, вы часто можете использовать простое правило, задавая вопрос «Какие параметры можно изменить?».

В случае std::getline() вы можетеобратите внимание, что первый параметр является неконстантной ссылкой на поток.Здесь хранится состояние (в вашем случае, в объекте std::stringstream ss).Если getline() сохранено в другом месте, вместо параметра потока будет указана ссылка на поток const.

Вы также можете проверить исходный код .

...