【问题标题】:What happened when press ctrl+D in while(cin>>i) loop in C++?在 C++ 的 while(cin>>i) 循环中按 ctrl+D 会发生什么?
【发布时间】:2016-08-11 15:34:57
【问题描述】:

我是 C++ 新手,对这个问题感到有些困惑。我使用 Mac OS X 和命令“g++ -std=c++11”来编译代码。

可能是这个问题太宽泛了,我不知道,但是如果有人可以用下面的例子解释一下吗?

int temp;
while (cin >> temp) {
    cout << temp << endl;
}

当我输入时

1 2 3<ENTER>

打印出来

1
2
3

如我所料,按下

<CTRL+D>

退出。

但是如果我输入

1 2 3<CTRL+D>

打印出来

1D
2

跟着我输入的字符“3”,然后我按下

<ENTER>

将打印最后一个字符“3”。那我应该按

<CTRL+D> 

再次退出。

此外,还有一个类似的例子:

vector<int> list; int temp;
while (cin >> temp) {
    list.push_back(temp);
}
for (auto e : list) {
    cout << e << endl;
}

当我输入时

1 2 3<ENTER><CTRL+D>

打印出来

1D
2
3

所以我的问题是:

这三种情况发生了什么然后我按

<CTRL+D> 

<ENTER>

?

为什么在第二种和第三种情况下都有一个“D”字符?以及如何防止它发生?

【问题讨论】:

  • 你确定你没有正确按下CTRL+D,也许你也按下了D?再试一次,看看行为是否重复!
  • @BiagioFesta 这不可能是真的,因为列表是整数。他怎么能推“D”?
  • "D" 不是您的程序打印的字符(它不能,它只打印数字)。这是你的终端驱动程序打印的东西。
  • @n.m.此帖子与所述帖子不重复。
  • @LiranFunaro 我不同意,但您始终可以使用重新打开按钮。

标签: c++ iostream


【解决方案1】:

这可能是由于控制台输出与您的输出重叠所致。

当您按下ctrl+D 时,控制台会打印^D,但随后会立即打印一个返回字符('\r')。这意味着之后将打印的所有内容都将打印在 ^D 上。

您的程序首先打印1,因此它只与^ 重叠,而D 保持不变。尝试插入一个两位数,您会看到D 消失了。

有些控制台会在返回字符后擦除该行,但有些控制台可能不会。

解决方案

(1) 您可以在开始打印列表之前简单地打印'\n' (std::endl)。这会将丑陋的^D 留在控制台中,但不会与您的打印重叠。

vector<int> list; int temp;
while (cin >> temp) {
    list.push_back(temp);
}
cout << endl; // Print before the list.
for (auto e : list) {
    cout << e << endl;
}

(2) 你可以先打印一个空行来删除这个打印。只需打印:" \r"(即,两个空格,然后是一个返回字符)。

int temp;
while (cin >> temp) {
    cout << "\r  \r" << temp << endl; // Print in each line
}

【讨论】:

  • 除了在输入的第一行按 Ctrl-D 的特殊情况外,这两种解决方案似乎都不起作用。
  • @n.m.我已经用明确的代码编辑了解决方案,以防止误解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2020-09-12
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多