【问题标题】:Different results when trying to use std::copy() with std::back_inserter to read from std::cin尝试将 std::copy() 与 std::back_inserter 一起使用以从 std::cin 读取时出现不同的结果
【发布时间】:2021-01-03 23:40:41
【问题描述】:

当我写this answer 时,我试图扫描一个以空格分隔的输入字符串并将其存储在一个向量中。一个user 建议使用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 4k

这是 MVCC 中的错误吗?

我正在使用 MVCC v14.27 (142) 和 Visual Studio 2019 (16.7)。

【问题讨论】:

  • 对不起。我删除了评论,因为我不想用我们已经尝试过的东西堵塞 cmets。我以为我们已经完成了......我很抱歉。
  • 有趣的是,那个版本的 VS 并没有那么旧,所以我希望它可以工作......

标签: c++ gcc visual-c++ stdcopy


【解决方案1】:

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

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

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

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

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

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

这里有更多信息:

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

【讨论】:

  • 哇!这真是个好消息!嗯......我有一种预感,它一定与缓冲端有关,但我认为我错了,因为它对你有用......非常感谢男人! :))
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 2011-06-12
  • 2010-10-28
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多