Program is skipping over Getline() without taking user input

11,038

Solution 1

Cin is probably leaving the carriage return in the buffer which getline retrieves. Try

cin.ignore(1000, '\n');

cin.getline(Record[Entrynumber].Address,70);

The >> operator doesn't remove the newline character after retrieving data, but ignores leading whitespace before retrieving data, while getline just retrieves whatever is in there, and removes the '\n' after reading as it is apart of the line it is 'getting'.

Solution 2

Seeing as how there might be input left over in the buffer which your getline is reading first, I'd suggest you clear the buffer before trying to input the next data:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
Share:
11,038
superlazyname
Author by

superlazyname

Updated on June 14, 2022

Comments

  • superlazyname
    superlazyname almost 2 years

    This is a very strange problem, when my program asks the user for the address, instead of waiting for input, it seems to skip the getline() function completely

    Answerinput:
    
    cout << "would you like to add another entry to the archive? (Y/N):";
    
    cin >> answer;
    
    cout << endl;
    cout << endl;
    
    answer = toupper(answer);
    
    
     switch(answer)
        {
        case 'Y':
            Entrynumber++;
    
            cout << "began record number " << Entrynumber << "+ 1." << endl;
    
            cout << "Enter the last name of the person to be entered" << endl;
    
            cin >> stringentry;
            cout << endl;
    
            stringlength = stringentry.length();
    
            strcpy(Record[Entrynumber].Last_Name, stringentry.c_str());
    
    
            Record[Entrynumber].Last_Name[stringlength] = '*';
    
    
    
            cout << "Enter the first name of the person" << endl;
    
            cin >> stringentry;
            cout << endl;
    
            stringlength = stringentry.length();
    
            strcpy(Record[Entrynumber].First_Name, stringentry.c_str());
    
            Record[Entrynumber].First_Name[stringlength] = '*';
    
            cout << "Enter the SSN of the person" << endl;
            cin >> Record[Entrynumber].SSN;
            cout << endl;
    
            cout << "Enter the age of the person" << endl;
            cin >> Record[Entrynumber].Age;
            cout << endl;
    
            cout << "Enter the address of the person" << endl;
    
    
            cin.getline(Record[Entrynumber].Address,70);
    
    
            cout << endl;
    
    
            stringentry = Record[Entrynumber].Address;
    
            stringlength = stringentry.length();
    
    
    
            Record[Entrynumber].Address[stringlength] = '*';
    
            cout << "you entered:" << endl;
    
    
    
            for(jim = 0 ; Record[Entrynumber].Last_Name[jim + 1] != '*' ; jim++)
            {
                cout << Record[Entrynumber].Last_Name[jim];
            }
    
            cout << ',' ;
    
    
            for(jim = 0 ; Record[Entrynumber].First_Name[jim + 1] != '*' ; jim++)
            {
                cout << Record[Entrynumber].First_Name[jim];
            }
    
            cout << endl;
    
            cout << Record[Entrynumber].SSN << endl;
            cout << Record[Entrynumber].Age << endl;
    
            for(jim = 0 ; Record[Entrynumber].Address[jim + 1] != '*' ; jim++)
            {
                cout << Record[Entrynumber].Address[jim];
            }
            cout << endl;
            cout << endl;
    
    
            goto Answerinput;
        case 'N':
            cout << "ok" << endl;
            break;
        default:
            cout << "invalid answer" << endl;
            goto Answerinput;
        }
    

    output to console

    would you like to add another entry to
    the archive? (Y/N):Y
    
    began record number 6+ 1. 
    
    
     Enter the last name of the person to be entered 
     John
    
    
     Enter the first name of the person 
     John
    
     Enter the SSN of the person  22222222
    
     Enter the age of the person  22
    
     Enter the address of the person
    
     you entered: 
    Joh,Joh 
    22222222 
    22
     *¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
     //////////////22 more lines of'|'//////////////////////////////////////////////
     ... 
    ¦¦¦¦¦¦¦¦l3-j
    
     would you like to add another entry to the archive? (Y/N):
    

    Both cin.getline() and getline() do the same thing.

    I'm using MVC++ 2008.

    All of the fields in the Record array are structs, Record[Entrynumber].Address is a char array.

  • superlazyname
    superlazyname over 13 years
    It works! Thanks! Why is leftover input getting to this getline() function?
  • Dominique McDonnell
    Dominique McDonnell over 13 years
    @jwaffe see the updated answer
  • Fei Lauren
    Fei Lauren almost 9 years
    This worked well for me. In my case I was prompting the user to input data into an array of ADT. Very frustrating as there was really nothing else in that function preceeding it - it just skipped the first input. I have it as a menu option using a switch - so it's picking up the enter press required to input the selection 0.o seems like a glaring flaw to me... Update: Though in my case it seems all that is required is cin.ignore();