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

Qia*_*ang 5 c++ iostream

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

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

int temp;
while (cin >> temp) {
    cout << temp << endl;
}
Run Code Online (Sandbox Code Playgroud)

当我输入

1 2 3<ENTER>
Run Code Online (Sandbox Code Playgroud)

它打印

1
2
3
Run Code Online (Sandbox Code Playgroud)

正如我所料,并按

<CTRL+D>
Run Code Online (Sandbox Code Playgroud)

退出.

但如果我输入

1 2 3<CTRL+D>
Run Code Online (Sandbox Code Playgroud)

它打印

1D
2
Run Code Online (Sandbox Code Playgroud)

跟随输入字符"3",然后按

<ENTER>
Run Code Online (Sandbox Code Playgroud)

将打印最后一个字符"3".然后我应该按

<CTRL+D> 
Run Code Online (Sandbox Code Playgroud)

再次退出.

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

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

当我输入

1 2 3<ENTER><CTRL+D>
Run Code Online (Sandbox Code Playgroud)

它打印

1D
2
3
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

在这三个案例中发生了什么然后我按下

<CTRL+D> 
Run Code Online (Sandbox Code Playgroud)

<ENTER>
Run Code Online (Sandbox Code Playgroud)

为什么在第二和第三种情况下会出现"D"字符?以及如何防止它发生?

Lir*_*aro 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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