2016-05-16 1 views
-2

Anfänger Programmierer hier, ich habe Probleme mit der Zeichenfolge Eingabe Struktur des Programms - Ich habe Probleme beim Speichern der Zeichenfolge Benutzereingabe für Jahr, Genre und Regisseur. Ich habe versucht, nicht mit cin >> mit getline, und verwenden Sie nur get() und getline() - aber der Fehler besteht immer noch mit den String-Eingaben nicht richtig gespeichert werden. EX: Wenn Benutzer die Auswahl "B", , eingibt und die Jahr-Zeichenketteneingabe "2015" in die Zeichenkettenvariable whatYear speichert, führt dies dazu, dass nicht richtig gespeichert wird. Wie repariert man?Wie String-Benutzereingabe ohne Verwendung von cin.ignore() und clear() - C++ zu beheben?

#include <iostream> 
#include <cctype> 
#include <string> 

void printYear(); 
void printGenre(); 
void printDirector(); 

using namespace std; 

int main(){ 

char choice; 

Der Benutzer wird eine Auswahl eingeben: 'B' für das Jahr, 'C' für Genre und 'D' für den Regisseur.

cout << "Hello movie'goer, please select one of the following choices:\n\n" 
<< "B - Display movies in a specific year\n" 
<< "C - Display movies in a specific genre\n" 
<< "D - Display movies from a specific director\n\n" 
<< "Enter your choice: "; 

choice = cin.get(); 

//Input validation 
while (toupper(choice) != 'B' && toupper(choice) != 'C' && 
    toupper(choice) != 'D') { 

cout << "Choice is invalid, the choice must be one of the following:'B', 'C', or" 
    << " 'D'. Re-enter your choice: "; 
choice = cin.get(); 
} 

cout << endl << endl; 

Hier verarbeitet es die Wahl. 'B' wird die String-Jahr-Eingabe ausgeben, 'C' druckt die String-Genre-Eingabe und 'D' druckt die String-Director-Eingabe.

Wenn die Auswahl 'B' für das Jahr eingegeben wird, habe ich Probleme beim Speichern der Jahreseingabe in der Stringvariablen whatYear.

void printYear() 
{ 
string whatYear; 
cout << "Enter a specific year: " << endl; 
getline(cin, whatYear); 

Ich überprüft, ob die Zeichenfolge Eingabe erfolgreich gespeichert wurde, aber es war ein Fehler.

cout << "The input stored in string whatYear is: " << whatYear; 
} 

Ich habe das gleiche Problem auch hier mit dem String-Eingang nicht erfolgreich in das String-Variable whatGenre gespeichert werden.

void printGenre() 
{ 
string whatGenre; 
cout << "Enter a specific genre: " << endl; 
getline(cin, whatGenre); 

Die cout-Anweisung wird hier nicht korrekt angezeigt.

cout << "The input stored in string whatGenre is: " << whatGenre; 
} 

Das gleiche Problem mit den anderen beiden Funktionen.

void printDirector() 
{ 
string whatDirector; 
cout << "Enter a specific director " << endl; 
getline(cin, whatDirector); 

cout << endl << "The input stored in string whatGenre is: " << whatDirector; 
} 

Antwort

1

Neben der Verwendung von nicht operator>> zusammen mit getline(), nicht get() mit getline() auch nicht verwenden, für die gleichen genauen Gründe. Verwenden Sie einfach konsistent getline(), um interaktive Eingabe zu verarbeiten, um diese Art von Chaos zu vermeiden.

Wenn Sie get() verwendet, um die Menüwahl zu lesen, und traten in „B“, gefolgt von verbrauchten get() bereitwillig den „B“ Charakter, aber das Newline blieb ungelesen, die die nachfolgenden getline() als leere Zeichenfolge verarbeitet, statt Verarbeitung das eingegebene Jahr.

Verwenden Sie immer konsistent getline(), um std::cin interaktiv zu lesen.

1

eine mögliche Erklärung ist, dass die cin.get() Funktion liest nur ein Zeichen, während Sie zwei eingeben (den Buchstaben und Enter). Der erste wird in choice gespeichert, während der zweite im Puffer gespeichert wird und eine leere Zeile an Ihren getline() Anruf ausgibt.

versuchen, den Puffer Reinigung vor dem getline Befehl mit fflush(stdin);

noch schlimmer Ausgabe: einigen Betriebssystemen (MS Windows - Ich bin auf Sie suchen) werden mit zwei Zeichen bei der Eingabe klicken: \ r \ n

0

Okay, mit get() mit getline() war das Problem. Mein Problem wurde gelöst, indem alles durch getline() ersetzt wurde und das get() in die Speichermenüoption als Char-Array konvertiert wurde, um cin.getline() zu verwenden. Danke für die Hilfe alle für diejenigen, die beantwortet haben, @Sam Varshavchik @kiwi

+0

Beachten Sie, dass Stack Overflow nicht als Helpdesk für die Lösung Ihrer persönlichen Probleme gedacht ist, sondern als eine FAQ wie Ressource für zukünftige Forschung. Das Problem, das Sie hatten, wurde oft zuvor gestellt, und eines der am häufigsten gestellten Q & A-Paare enthält bereits die Antwort. Daher habe ich deine Frage als Duplikat markiert. –