繁体   English   中英

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

[英]Different results when trying to use std::copy() with std::back_inserter to read from 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 上工作的原因是您将输入输入到一个小框中,因此必须将其作为文件重定向 - 它不是真正的交互式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM