C++ 为什么在同一输入上调用std::getline()n次会产生第n个标记化?

C++ 为什么在同一输入上调用std::getline()n次会产生第n个标记化?,c++,getline,C++,Getline,这是对该问题公认答案的后续问题: 在以下代码中,(函数doSegment()引用自answerer@billz): #包括 #包括 #包括 整数段(常量字符*句子) { std::stringstream ss(句子); std::字符串到; if(句子!=NULL) { while(std::getline(ss,to,'\n')){ 当您不确定状态存储在何处时,通常可以使用简单的经验法则,询问“可以修改哪些参数?” 在std::getline()的情况下,您可以看到第一个参数是对流的非常量引

这是对该问题公认答案的后续问题:

在以下代码中,(函数
doSegment()
引用自answerer@billz):

#包括
#包括
#包括
整数段(常量字符*句子)
{
std::stringstream ss(句子);
std::字符串到;
if(句子!=NULL)
{
while(std::getline(ss,to,'\n')){

当您不确定状态存储在何处时,通常可以使用简单的经验法则,询问“可以修改哪些参数?”

std::getline()
的情况下,您可以看到第一个参数是对流的非常量引用。这是存储状态的地方(在您的情况下,在
std::stringstream ss
对象中)。如果
getline()
storagestate在别处,stream参数将是对
const
流的引用


您还可以检查。

当您不确定状态存储在何处时,通常可以使用简单的经验法则询问“可以修改哪些参数?”

std::getline()
的情况下,您可以看到第一个参数是对流的非常量引用。这是存储状态的地方(在您的情况下,在
std::stringstream ss
对象中)。如果
getline()
storagestate在别处,stream参数将是对
const
流的引用


您还可以检查。

流比
strtok
具有更多的智能。对象中隐藏着一个读取索引成员变量,该变量在提取数据时是高级的。除非您倒带指针(例如使用
seekg
调用)您将继续捕获流中的下一个数据。或者,换句话说,
stringstream
的行为类似于字符串和流。流行为的核心是,它可以将其数据传递给调用方,调用方从中请求连续的对象。请阅读cppreference的文档,通过包装一个
std::string
。尝试执行
doSegment(NULL);
调用。看起来意图是
doSegment
应该处理
NULL
(或者
nullptr
)。流比strtok
聪明得多。对象中隐藏着一个读取索引成员变量,该变量在提取数据时是高级的。除非您倒带指针(例如使用
seekg
调用)您将继续捕获流中的下一个数据。或者,换句话说,
stringstream
的行为类似于字符串和流。流行为的核心是,它可以将其数据传递给调用方,调用方从中请求连续的对象。请阅读cppreference的文档,通过包装一个
std::string
。尝试执行
doSegment(NULL);
调用。看起来意图是
doSegment
应该处理
NULL
(或者
nullptr
)。
#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;
}