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