0

当我写这个答案时,我试图扫描一个空格分隔的输入字符串并将其存储在一个向量中。用户建议使用std::back_inserter接受std::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) 一起使用。

4

1 回答 1

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 上工作的原因是您将输入输入到一个小框中,因此它必须作为文件重定向 - 它不是真正的交互式。

于 2020-09-17T08:03:42.840 回答