键盘中断在关闭前向终端添加数字

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,我没有看到 notstd::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.ignorectd::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');
    }
}