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