gpt4 book ai didi

c++ - 为什么在同一输入上调用 std::getline() n 次会传递第 n 次标记化?

转载 作者:行者123 更新时间:2023-11-28 01:25:54 24 4
gpt4 key购买 nike

这是此问题已接受答案的后续问题:C++ split string by line

在下面的代码中,(函数 doSegment() 引用自回答者@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 标记化存储到输出中争论? IE。 std::getline() 如何跟踪它已被调用 n 次并且需要传递第 (n + 1) 标记化?

即作为比较,strtok() 通过让您将 NULL 作为输入参数传递来做到这一点,这样它就知道要对其静态局部变量进行操作 - 但它会修改其输入。 std::getline() 的使用示例既不需要在第一次迭代后将 NULL 作为输入传递,也不会修改其输入。

我确实尝试阅读了 cppreference 和 cplusplus 上关于 std::getline() 的文章,但他们似乎并没有真正回答这个问题,我也没有发现这个问题存在已经到了。

感谢任何能告诉我这是如何工作的人。

最佳答案

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

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

您还可以检查 source code .

关于c++ - 为什么在同一输入上调用 std::getline() n 次会传递第 n 次标记化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53891979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com