如何解决尝试将std :: copy与std :: back_inserter一起使用以从std :: cin读取时,结果不同
在编写this answer时,我试图扫描以空格分隔的输入字符串并将其存储在向量中。 user建议使用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中的错误吗?
我在Visual Studio 2019(16.7)中使用MVCC v14.27(142)。
解决方法
我已经知道发生了什么事。
当您使用std :: getline()读取一些文本,然后将其放入std :: stringstream中以使用while循环进行处理时,您只读取了一行文本(直到enter键),然后停止阅读输入。
当您使用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上工作的原因是,您将输入输入到一个小方框中,因此必须将其重定向为文件-它并不是真正的交互性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。