CIN 到矢量输入循环无限期.为什么

cin to vector input loops indefinitely. Why?

本文关键字:循环 无限期 为什么 输入 CIN      更新时间:2023-10-16

好的,所以我浏览了一下,在 hackerrank 上找到了以下用于气泡排序的实现。

现在,这将使用以下 while 循环作为输入:

while (cin >> t)

它在hackerrank站点上执行,但不在我的IDE(CLion,如您所见(中执行,即程序无限期地接受输入。我还发现,网站上的许多帖子在将输入到向量时也使用或建议类似的代码。我目前正在使用堆栈溢出帖子中建议的其他方法,有些方法工作不多。我的问题是

  • 为什么程序无限期地接受输入?
  • 是否有任何条件/类似标志之类的违规行为?
  • 这是否在 C++14 或类似的东西中删除了?

通常,当您运行可执行文件时,其标准输入绑定到某个交互式媒体(终端或控制台(。这样的介质通常没有和结束,除非你显式发送文件结束(例如在 Linux 上使用 Ctrl+D(。因此,循环永远不会终止,因为读取总是可以阻塞并等待更多输入。

如果将可执行文件的标准输出重定向为从文件读取,则情况会有所不同。在典型的 shell 中,这是您使用 < 实现的:

myprog < file.txt

这样,程序的标准输入将是文件的文件描述符,当您读取文件末尾时,从中读取将发出EOF的正常信号。

在 C 语言结构中,我使用

while(scanf("%d %d", &a, &b)==2) 
or
while(scanf("%d %d", &a, &b)!=EOF)

持续获取输入

我试着int x=scanf("%d %d", &a, &b)看看发生了什么
它给了我 x=2,这就是循环连续运行的原因(原因 2==2(

因为C++输入流会给你一个布尔值(如果我没错的话(
您可以选中bool x=cin>>var;以查看该值。对于正确的输入,它将始终给出 1。
所以while(cin>>something)实际上意味着while(1)这就是循环连续获取输入的原因。
这不是一个好的答案,但我认为这是有道理的。

while(std::cin >> somevar &&
      somevar != "n")
{ }

如果您知道终止顺序,我会推荐此解决方案。