键盘中断在关闭前向终端添加数字
Keyboard interrupt adding numbers to terminal before closing
来自 python 的 C++ 新手。当我编译 运行 以下代码,然后在输入任何内容之前按 Ctrl+C,我看到终端仍然打印 You entered 0^C
.
#include <iostream>
int main()
{
int num1;
std::cin >> num1;
std::cout << "You entered " << num1 << "\n";
}
首先,来自 Python,我没有看到 not 在 std::cin
没有收到输入时抛出错误的好处,并且不明白为什么允许程序继续执行以下操作的动机。 当 std::cin
不起作用时不抛出错误的原因是什么?
其次,这种行为是否表明 num1
在初始化之前的值为零? 我最初的想法是,也许 num1
被赋予了默认值0
的值,即使它没有被初始化。然而,下面的代码似乎打破了这个猜测:当我在编译和 运行ning 下面的代码后按 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++ 问题还是与 OS 处理键盘中断的方式有关?我觉得我之前可能已经看到数字在中断 python 脚本时继续 ^C
,但没有考虑它。
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
来清除行尾。这是为了以防万一,例如,用户应该输入整数,但却输入了文本。
在下面的示例中,如果您在需要整数时输入文本,那么 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');
}
}
来自 python 的 C++ 新手。当我编译 运行 以下代码,然后在输入任何内容之前按 Ctrl+C,我看到终端仍然打印 You entered 0^C
.
#include <iostream>
int main()
{
int num1;
std::cin >> num1;
std::cout << "You entered " << num1 << "\n";
}
首先,来自 Python,我没有看到 not 在 std::cin
没有收到输入时抛出错误的好处,并且不明白为什么允许程序继续执行以下操作的动机。 当 std::cin
不起作用时不抛出错误的原因是什么?
其次,这种行为是否表明 num1
在初始化之前的值为零? 我最初的想法是,也许 num1
被赋予了默认值0
的值,即使它没有被初始化。然而,下面的代码似乎打破了这个猜测:当我在编译和 运行ning 下面的代码后按 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++ 问题还是与 OS 处理键盘中断的方式有关?我觉得我之前可能已经看到数字在中断 python 脚本时继续 ^C
,但没有考虑它。
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
来清除行尾。这是为了以防万一,例如,用户应该输入整数,但却输入了文本。
在下面的示例中,如果您在需要整数时输入文本,那么 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');
}
}