我是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"字符?以及如何防止它发生?
这可能是由于控制台输出与您的输出之间重叠造成的。
当您按 时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)