Mixing formatted input extractors with getline causes cout display to stick together

匿名 (未验证) 提交于 2019-12-03 01:44:01

问题:

The following code seves to establish a movie database and query through it. It works as intended except for the first cout statements being clumped together. The code is as follows.

// array of structures #include <iostream> #include <string> #include <sstream> #include <stdio.h> #include <cctype> using namespace std;  #define NUM_MOVIES 6 //structure struct movies_iit{     string title;     int year; } films [NUM_MOVIES]; //global variables char title [20], y, n; int year; string search; //function 1 void sort_on_title(movies_iit films[], int n) { //Local struct variable used to swap records movies_iit temp;      for(int i=0; i<n-1; i++)     { for(int i=0; i<n-1; i++)         { /*If s[i].title is later in alphabet than s[i+1].title, swap the two records*/         if(films[i].title>films[i+1].title)             {                 temp = films[i];                 films[i] = films[i+1];                 films[i+1] = temp;             }           }     } } //end function 1 //function query1 prototype void query1 (movies_iit movie); //function query2 prototype void query2 (movies_iit movie); //function 2 prototype void printmovie (movies_iit movie); //beginning of main int main () { //login //username: user //password: word string mystr; int n; char response; string pass; string name; cout << "enter your username "<<endl; cin >> name; cout << "enter your password "<<endl; cin >> pass;  cout << "\n" << endl;  if (name == "user" && pass == "word")     cout << "Welcome, user." << endl; else {cout << "###" <<  "unrecognized username/password combination" << "\t" << "please try again"     << "###" << endl;     system("PAUSE");     return 0;     } for (n=0; n<NUM_MOVIES; n++) {     cout << "Enter title: ";     getline (cin,films[n].title);     cout << "Enter year: ";     getline (cin,mystr);     stringstream(mystr) >> films[n].year; } //sort records, function 1 call sort_on_title(films, NUM_MOVIES); cout << "\nYou have entered these movies:\n"; for (n=0; n<NUM_MOVIES; n++)      printmovie (films[n]);  //function 2 call //Query 1 cout << "Perform an alphabetical search? (y/n)" << endl; cin >> response;  if (response == 'y')     {cout << "Please enter title" << endl;     cin >> title;     for (n=0; n<NUM_MOVIES; n++)         {query1 (films[n]);             response == n;         }     } else if (response == 'n')     cout << "\n" << endl; else     cout << "invalid entry" << endl; //Query 2 cout << "Perform a chronological search? (y/n)" << endl; cin >> response; //greater than if (response == 'y') {   cout << "greater than what year?" << endl;     cin >> year;     for (n=0; n<NUM_MOVIES; n++)         {   query2 (films[n]);         } } else if (response == 'n')     cout << "Thank you, goodbye." << endl; else     cout << "invalid entry" << endl; system("pause"); return 0; } //end of  main //function 2 definition void printmovie (movies_iit movie) {   cout << movie.title;   cout << " (" << movie.year << ")\n"; } //function query1 defintion void query1 (movies_iit movie) {   if (movie.title == title)       {cout << " >> " << movie.title;   cout << " (" << movie.year << ")\n";}   else       {cout << movie.title;   cout << " (" << movie.year << ")\n";} } //function query2 definition void query2 (movies_iit movie) {   if (movie.year >= year)       {cout << movie.title;         cout << " (" << movie.year << ")\n";       } } 

I managed to trace the problem back to the login at the beginning of the code, without the

cout << "enter your username "<<endl; cin >> name; cout << "enter your password "<<endl; cin >> pass;  cout << "\n" << endl;  if (name == "user" && pass == "word")     cout << "Welcome, user." << endl; else {cout << "###" <<  "unrecognized username/password combination" << "\t" << "please try again"     << "###" << endl;     system("PAUSE");     return 0;     } 

section, the code works fine. Why is the beginning of my code sticking together, and how can I fix it without omitting the login?

回答1:

cin >> pass stops reading at the whitespace, but it is still there in the buffer. When you call getline it sees the newline waiting in the buffer and returns. You need to empty the buffer before you call getline.

See: http://en.cppreference.com/w/cpp/io/manip/ws

It also looks like you have an error here:

for (n=0; n<NUM_MOVIES; n++)     {query1 (films[n]);         response == n;     } 

Should that be response = n? As it stands that statement has no utility.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!