cin.sync() Problem



  • Habe ein Problem mit dem Code.
    Dachte das geht mit cin.sync(), aber das Programm zickt noch.
    Nach der 1. Eingabe (Name) springt er gleich zur Ausgabe, also lässt keine 2. Eingabe zu.
    Ich habe die Suche schon benutzt, aber weder "cin.clear", noch" cin.ignore(cin.rdbuf () -> in_avail () );"helfen weiter.
    Compiler ist GCC 3.3.

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    //Zum Loeschen des Bildschirms
    void clrscr()
    {
            cerr << "\033[2J";
    }
    
    // Zum Setzen des Cursors an eine bestimmte Position:
    void gotoxy( const unsigned short int Zeile , const unsigned short int Spalte )
    {
            cerr << "\033[" << Zeile << ';' << Spalte << 'f';
    }
    
    // vergleichbar mit getch() in Win
    void wait()
    {
            cin.clear();
            cin.ignore(cin.rdbuf () -> in_avail () );
            cin.get();
    }
    
    int main()
    {
            clrscr();
            gotoxy(1, 1);
    
            char name[10];
            char adresse[15];
    
            cout << "Name eingeben: ";
            cin.sync();
            cin.get (name, 10);
            cout << "Adresse eingeben: ";
            cin.sync();
            cin.get (adresse, 15);
    
            cout << "Name ist: " << name << endl;
            cout << "Adresse ist: " << adresse << endl;
    
            wait();
            return 0;
    }
    


  • Ich habe die Suche schon benutzt, aber weder "cin.clear", noch" cin.ignore(cin.rdbuf () -> in_avail () );"helfen weiter.

    clear() hat überhaupt nichts mehr der Problematik zu tun. in_avail() liefert nur unter manchen Implementationen für dich sinnvolle Ergebnisse.

    Versuch's mal mit einem guten alten:

    // für numeric_limits musst du <limits> inkludieren
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
    // alternativ: #include <climits>
    cin.ignore(INT_MAX, '\n');
    


  • Jo, jetzt klappt's.
    Seh das aber jetzt zum 1. Mal.

    Kannst bisschen mehr drüber sagen ?
    Welche Funktion wendet man wann an ?
    Welche ist normalerweise sinnvoll ?
    Sind ja alt bekannte Funktionen laut deiner Aussage 😉



  • Zickedi schrieb:

    Kannst bisschen mehr drüber sagen ?

    Nicht mehr als jede gute Library-Referenz.
    istream::ignore extrahiert und verwirft bis zu n Zeichen des Stroms. Sollte vorher das Delimiter-Zeichen oder eof auftreten endet der Extraktionsvorgang vorzeitig (falls Delimiter != eof wird das Zeichen extrahiert und verworfen).

    Hier spezifizieren wir n als "größte für einen Stream mögliche Zahl" und als Delimiter '\n', da das newline-Zeichen das ist, welches häufig nach einer Eingabeoperation noch im Stream steht.

    Welche Funktion wendet man wann an ?

    Welche Funktionen stehen denn zur Auswahl? Für das was du machen willst, ist

    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    die gängigste Lösung (die Variante mit INT_MAX ist nur eine alternative Schreibeweise für Leute mit Template-Allergie).



  • Ok, danke. Wieder was gelernt.

    Werd mir die beiden Zeilen merken. : 🙂


Anmelden zum Antworten