Program is skipping over Getline() without taking user input
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');
superlazyname
Updated on June 14, 2022Comments
-
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 over 13 yearsIt works! Thanks! Why is leftover input getting to this getline() function?
-
Dominique McDonnell over 13 years@jwaffe see the updated answer
-
Fei Lauren almost 9 yearsThis 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();