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

时间:2016-08-11 15:34:58

标签: c++ iostream

我是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”字符?以及如何防止它发生?

1 个答案:

答案 0 :(得分: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
}