getchar() wird übersprungen



  • Hi, nur wenn ich sowohl im Hauptprogramm und in den einzelnen Funktionen ein getchar(); schreibe wird dort angehalten, wenn ich das nur in der Funktion oder nur im Hauptprogramm schreibe, wird es übersprungen. Warum???????????

    Hier mein Code:

    #include <iostream>
    #include <math.h>
    using namespace std;
    
    void Ausgabetext();
    void km_Meilen();
    void Meilen_km();
    
    int main()
    {
    	int iEingabe=0;
    
    	cout << "\tUmrechnung km - Meilen / Meilen - km\n";
    	Ausgabetext();						// Aufruf der Funktion Ausgabetext
    	cout << "\n1 --> km - Meilen";
    	cout << "\n2 --> Meilen - km";
    	cout << "\n\nEingabe: ";
    	cin >> iEingabe;
    
    	if (iEingabe == 1)
    	{	km_Meilen();					// Aufruf der Funktion km_Meilen
    	}
    	else
    	{	Meilen_km();					// Aufruf der Funktion Meilen_km
    	}
    	getchar();
    }
    
    // ------------------------------------------------------------------------------------
    // ------------------------------------------------------------------------------------
    void Ausgabetext()
    {
    	cout << "\nBitte machen Sie die geforderte Eingabe."; 
    	cout << "\nDas Programm wird fuer Sie dann die gewuenschten Optionen durchfuehren.\n";
    }
    
    // ------------------------------------------------------------------------------------
    // ------------------------------------------------------------------------------------
    void km_Meilen()
    {	double dkm=0;
    	double dmile=0;
    
    	Ausgabetext();
    	cout << "\nkm:\t";
    	cin >> dkm;
    	dmile=dkm/1.609;
    	cout << dkm << " km entsprechen " << dmile << " Meilen.";
    }
    
    // ------------------------------------------------------------------------------------
    // ------------------------------------------------------------------------------------
    void Meilen_km()
    {	double dmile=0;
    	double dkm=0;
    
    	Ausgabetext();
    	cout << "\nMeilen:\t";
    	cin >> dmile;
    	dkm=dmile*1.609;
    	cout << dmile << " Meilen entsprechen " << dkm << " km.";
    }
    


  • Du hast nach den letzten cin>>... Befehlen noch einen '\n' im Tastaturpuffer - der wird dann vom getchar() ausgelesen.



  • wo genau? in den funktionen, im hauptprogramm, überall? ich finde aber keins, das wegkann.... was mach ich dann?



  • Hallo,

    ich bin mir nicht ganz sicher, aber soweit ich weiß kannst du anstatt "\n" "endl" schreiben, damit wird der Puffer geleert.



  • @EEK: was hat denn endl mit der Eingabe zu tun?
    @sarah: Fakt ist, daß du vor dem getchar()-Aufruf deinen Tastaturpuffer ausleeren mußt. Am schnellsten dürfte das mit einem cin.ignore(1,'\n'); funktionieren.



  • Ich meinte das wenn Sie anstatt "\n" "endl" schreibt der Puffer dann automatisch geleert wird und somit das "\n" nicht mehr im Puffer steht, aber wie gesagt ich war mir nicht sicher.



  • sarah1986 schrieb:

    wo genau? in den funktionen, im hauptprogramm, überall? ich finde aber keins, das wegkann.... was mach ich dann?

    Nach jedem cin. Beispiel:

    cin >> iEingabe;
    

    Du gibst 1 ein und drückst Enter. Dann liegt im Puffer (Stream Buffer) von cin der String "1\n". Der >> Operator arbeitet folgendermaßen: Erst überspringt er sämtlichen Whitespace (Leerzeichen, Tabs, Newlines etc.), sowas hast du hier aber nicht. Dann liest er, vereinfacht gesagt, solange des gelesene Sinn ergibt, und schreibt das entschlüsselt in die übergebene Variable. Auf dem "\n" bleibt er stehen, und das bleibt nach der Aktion im Puffer und würde vom nächsten >> Operator wieder übersprungen werden. Du rufst aber getchar auf, was dir genau dieses Newline-Zeichen zurückgibt.

    Es gibt ca. 3 Lösungen:

    1. Du liest alles bis zum \n selbst ein:
    while (getchar() != '\n);
    
    1. Du ignorierst alles, was noch im Puffer ist:
    cin.ignore(cin.rdbuf()->in_avail());
    

    (das sollte eigentlich in der FAQ stehen, ich habs aber nicht gefunden 😕)
    3) (Hat undefiniertes Verhalten, funktioniert aber wohl auf manchen Systemen und wird daher leider oft empfohlen. Aber nicht von mir 🙂 EEK spielt darauf an, aber formuliert es nicht richtig)

    BTW: Du solltest dich auf ein IO-System beschränken. getchar gehört zu <cstdio> und cin zu <iostream>. Die beiden sind zwar standardmäßig synchronisiert, aber das eigentlich nur aus Kompatibilität. In neuen Programmen sollte man das IMHO nicht ausnutzen. Ersetze einfach jedes getchar() durch cin.get().



  • cin >> ws;
    löscht meiner meinung nach den buffer^^
    hilft das?



  • muss ich dann mal probieren. Bin aber grad an was anderem dran. Falls nicht, muss ich halt zweimal den Befehl schreiben.
    Auf jeden Fall: TAUSEN DANK AN EUCH ALLE! 😃


Anmelden zum Antworten