Search code examples
c++cingets

C instruction is being reordered when cin cout and gets is used consecutively


Does anyone knows why C instruction is being reordered when cin cout and gets is used consecutively here? I am using Dev-C++ 4.9.9.2.

#include<iostream>
using namespace std;

int main(){
    char a[10],b;
    for(;;){
        cout<<"\ncin>>b:";
        cin>>b;
        cout<<"gets(a):";
        gets(a);
        cout<<"cout<<a<<b:"<<a<<" "<<b<<"\n\n";
    }
}

I got an output like:

cin>>b:132
gets(a):cout<<a<<b:32 1


cin>>b:465
gets(a):cout<<a<<b:65 4


cin>>b:312242
gets(a):cout<<a<<b:12242 3


cin>>b:1
gets(a):cout<<a<<b: 1

cin>>b:

It seemed like some input for cin was passed in gets.. and it also appears that instructions were reordered like:

cin>>b;
gets(a);
cout<<"gets(a):";

instead of,

cin>>b;
cout<<"gets(a):";
gets(a);

Solution

  • cin>>b read just a character, leaving the rest of the input to be read by later input operation. So gets sill has something to read and don't block.

    At the first cin >> b, there is no input available. You enter '132\n' (input from terminal is usually made line by line) in a buffer and just get the 1 out of it. gets reads the next characters 32 and the \n which terminates gets. It doesn't need to read something more from the terminal.