Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Keyboard interrupt adding numbers to terminal before closing

C++ newbie coming from python. When I compile and run the following code, then press Ctrl+C before inputting anything, I see the terminal still prints You entered 0^C.

#include <iostream>

int main()
{
    int num1;
    std::cin >> num1;
    std::cout << "You entered " << num1 << "\n";
}

First of all, coming from Python, I don’t see the benefit of not throwing an error when std::cin receives no input, and don’t understand the motivation of why the program is allowed to continue to following lines. What’s the reasoning for not throwing an error when std::cin doesn’t work?

Second, is this behavior suggesting that num1 has a value of zero before initialization? My initial thought was that perhaps num1 is given a default value of 0 even though it wasn’t initialized. However, the following code seems to break that guess: when I hit Ctrl + C after compiling and running the code below, the screen prints You entered 24^C, or sometimes You entered 2^C, or sometimes just You entered ^C. If I rebuild the project, a different number appears.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

#include <iostream>

int main()
{
    int num1, num2, num3;
    std::cin >> num1 >> num2 >> num3;
    std::cout << "You entered " << num1 << ", " << num2 << ", " << num3 << "\n";
}

I thought this might have something to do with the buffer, but adding std::cin.ignore() didn’t prevent this behavior.

Is this a C++ thing or does it have to do with how the OS handles keyboard interrupts? I feel like I might have seen numbers proceeding the ^C while interrupting python scripts before, but didn’t think about it.

>Solution :

num1 is not initialized, which means it contains whatever random value was in memory.

When control-c is pressed, std::cin >> num1; fails. Then next line will print some random value that was in num1 earlier.

The correct version should be

int num1 = 0;
if (std::cin >> num1)
    std::cout << "You entered " << num1 << "\n";

You can use std::cin.ignore and ctd::cin.clear to clear the end of line. That’s in case, for example, the user is supposed to enter integer, but enters text instead.

In the example below, if you enter text when integer is expected, then cin will keep trying to read the line, unless the line is cleared.

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');
    }
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading