尝试使用 std::copy() 和 std::back_inserter 从 std::cin 读取时的不同结果

凯萨林

当我写这个答案时,我试图扫描一个以空格分隔的输入字符串并将其存储在一个向量中。一个用户建议使用std::back_inserterstd::copy()接受输入,超过的用法std::istringstream

std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(vec));

这看起来很好(并且也很好用!)。但是,当我将代码复制粘贴到 Visual Studio 中时,它只会在非数字输入时中断,例如:

3 2 1 4<空格/无空格>k

这是 MVCC 中的错误吗?

我将 MVCC v14.27 (142) 与 Visual Studio 2019 (16.7) 一起使用。

杰里耶利米

我已经弄清楚发生了什么。

当您使用 std::getline() 读取一些文本,然后将其放入 std::stringstream 以使用 while 循环处理它时,您将准确读取一行文本(直到输入键),然后停止读取输入.

当您使用 while(std::cin>>x) 或将 std::copy 与 std::input_iterator 一起使用时,它会从 std::cin 中提取信息,直到到达无法解析的内容或到达结尾输入 - 它跳过所有空格(包括回车键)

在这种情况下,我们正在读取 int 值,因此 std::getline()/std::stringstream/while 方法只获取一行文本,然后 while 继续提取整数直到输入结束 - 在这种情况下,它是结束我们读取的字符串。

但是当使用 while(std::cin>>x) 或 std::copy 时,究竟什么表示输入的结束?它不是回车键,因为那是空格。如果您从文件重定向输入,它将是文件的结尾。但是交互式地,你如何使键盘输入结束?

  • 在 Unix shell 中按 Ctrl-D 键
  • 在 Windows 上,按 Ctrl-Z 键作为新行的第一个字符

以下是更多信息:

我的示例在 reextester.com 上工作的原因是您将输入输入到一个小框中,因此必须将其作为文件重定向 - 它不是真正的交互式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章