为什么在同一输入上调用std::getline()n次会产生第n个标记化
Why does calling std::getline() n times on the same input deliver the nth tokenization?
这是这个问题的已接受答案的后续问题: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 << "hellonworld" << std::endl << "my" << std::endl << "name" << std::endl << "is nobody";
doSegment( oss.str().c_str() );
return 0;
}
代码的行为完全符合预期:它在换行上标记输入字符串
问题:为什么对同一输入参数迭代调用std::getline()
会导致存储到输出参数的下一个标记化?即,std::getline()
如何跟踪它被调用n次,并需要交付第(n+1)个标记化?
也就是说,作为比较,strtok()
通过将NULL
作为输入参数进行传递来实现这一点,这样它就知道要对其静态局部变量进行操作,但它会修改其输入。std::getline()
的示例使用既不需要在第一次迭代后传递NULL作为输入,也不修改其输入。
我确实试着在cppresence和cplusplus上阅读了std::getline()
的文章,但他们似乎并没有真正回答这个问题,我也没有发现这个问题已经存在了。
感谢任何能启发我这是如何运作的人。
当您不确定状态存储在哪里时,通常可以使用简单的经验法则,询问"可以修改哪些参数?"。
在std::getline()
的情况下,可以看到第一个参数是对流的非常量引用。这就是状态的存储位置(在您的情况下,在std::stringstream ss
对象中)。如果getline()
在其他地方存储状态,则流参数将改为对const
流的引用。
您也可以检查源代码。
相关文章:
- 使用 pybind11 调用 Python 函数时避免复制输入数据
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 使用多个输入向量中值的笛卡尔乘积调用 lambda
- 程序在调用函数时跳过用户输入
- 从 C++ 调用 GNU 绘图,无需用户输入
- GoogleMock:如何验证输入参数的调用次数?
- 对需要双精度数组和结构作为输入C++ DLL 函数的 C# 调用
- 使用 Spirit x3,如何控制在每个不同的输入上调用哪个解析器?
- 如何使用低级系统调用从 stdin 和输入文件中获取字节数
- 是否可以使用输入作为对字符串的调用
- 干净取消在输入/输出调用中被阻止的 std::线程
- 功能调用不起作用,但控制台仍允许输入
- 我可以在输入BSTR变体上调用variantChangeType吗?
- 实现递归函数,避免由 C++ 中 include 的循环调用(没有 #pragma 一次)引起的无限循环输入
- 为什么在同一输入上调用std::getline()n次会产生第n个标记化
- 功能调用,该函数从文本文件-C 检查输入正确性
- 在多线程中调用带有输入参数的函数
- 析构函数的调用.和输入输出过载
- C++自定义用户输入调用变量
- 基于字符串输入调用函数