我是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
}

关于c++ - 在C++中的while(cin >> i)循环中按ctrl + D会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38900674/

10-10 21:30