来自python的C++新手。当我编译并运行以下代码,然后在输入任何内容之前按Ctrl+C时,我看到终端仍然打印You entered 0^C
。
#include <iostream>
int main()
{
int num1;
std::cin >> num1;
std::cout << "You entered " << num1 << "n";
}
首先,来自Python,当std::cin
没有收到输入时,我看不到不抛出错误的好处,也不明白为什么允许程序继续执行以下行的动机当std::cin
不工作时,不抛出错误的原因是什么
其次,这种行为是否意味着num1
在初始化之前的值为零我最初的想法是,也许num1
被赋予了默认值0
,即使它没有初始化。然而,下面的代码似乎打破了这种猜测:当我在编译并运行下面的代码后按下Ctrl+C时,屏幕会打印You entered 24^C
,有时打印You entered 2^C
,有时只打印You entered ^C
。如果重新生成项目,则会显示一个不同的数字。
#include <iostream>
int main()
{
int num1, num2, num3;
std::cin >> num1 >> num2 >> num3;
std::cout << "You entered " << num1 << ", " << num2 << ", " << num3 << "n";
}
我认为这可能与缓冲区有关,但添加std::cin.ignore()
并不能阻止这种行为。
这是C++的问题,还是与操作系统如何处理键盘中断有关?我觉得我以前可能看到过数字在^C
上运行,同时中断python脚本,但没有想过
num1
未初始化,这意味着它包含内存中的任何随机值。
当按下control-c时,std::cin >> num1;
失败。然后下一行将打印之前num1
中的一些随机值。
正确的版本应该是
int num1 = 0;
if (std::cin >> num1)
std::cout << "You entered " << num1 << "n";
您可以使用std::cin.ignore
和ctd::cin.clear
来清除行的末尾。例如,在这种情况下,用户应该输入integer,但却输入文本。
在下面的示例中,如果在应为integer时输入文本,则除非清除该行,否则cin
将继续尝试读取该行。
for (int i = 0; i < 3; i++)
{
std::cout << i << " - Enter integer:n";
if (std::cin >> num1)
{
std::cout << "You entered " << num1 << "n";
}
else
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
}
}