Это дополнительный вопрос к принятому ответу на этот вопрос: 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, но они этого не сделалиПохоже, я действительно не отвечаю на этот вопрос, и я уже не нашел этого вопроса здесь.
Благодарен всем, кто может просветить меня, как это работает.