在 C++ 中按 ctrl+D 在 (cin>>i) 循环中时发生了什么?

What happened when press ctrl+D in while(cin>>i) loop in C++?

本文关键字:gt 发生了 什么 循环 ctrl+D cin 中按 C++      更新时间:2023-10-16

我是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,但随后立即打印返回字符('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
}