Wieder zwei unsinnige Funktionen!


  • Mod

    Sollte funktionieren. Dritten Link in meiner Signatur durchlesen.



  • Seikuassi schrieb:

    Hallo volkard,

    Hier nun das Testprogramm:

    #include <iostream>
    
    using namespace std;
    
    void in_int (int &x) {
        int *y = &x;
        cin >> *y;
    };
    int main () {
    	int x;
    	in_int (x);
    	// hier stürzt das Programm ab
    	cout << "\n\n\n" << x;
    	cin.peek ();
    	return 0;
    };
    

    Kompiliert wurde die Quelldatei mit g++.exe vom MinGW.

    Wo liegt nun der Fehler?

    MfG

    Seikuassi

    Das Programm stürzt nicht ab.



  • Hallo volkard,

    Kleine Änderung: Das Programm scheint doch zu funktionieren, aber es wird beendet bzw. ignoriert scheinbar den Befehl "cin.peek ()".
    Warum?

    main.cpp:

    #include <iostream>
    
    using namespace std;
    
    void in_int (int &x) {
        int *y = &x;
        cin >> *y;
    };
    int main () {
    	int x;
    	in_int (x);
    	cout << "\n\n\n" << x;
        // ignoriert den nächsten Befehl
    	cin.peek ();
    	return 0;
    };
    

    Bei dem anderen Code funktioniert allerdings der "cin.peek ()" wieder:

    #include <iostream>
    
    using namespace std;
    
    void in_string (string &x) {
    		string *y = &x;
    		getline (cin,*y);
    };
    int main () {
    	string x;
    	in_string (x);
    	cout << "\n\n\n" << x;
        // hier funktioniert cin.peek () wieder
    	cin.peek ();
    	return 0;
    };
    

    Also, wenn man jetzt keinen Fehler findet, dann muss doch das am Kompiler liegen, oder?

    Danke im Voraus!

    MfG

    Seikuassi



  • Das Programm stürzt nicht ab.

    😕 Dann muss es doch am Compiler liegen, oder?





  • Hier das Programm zum Download (virenfrei):

    http://www.file-upload.net/download-7716476/main.exe.html



  • Der Compiler ignoriert peek() im ersten Code, weil der Zeilenumbruch bei der Extraktion von Skalaren nicht mit extrahiert wird.
    getline() nimmt den Zeilenumbruch hingegen schon raus.

    Bekanntes Beispiel, warum man formatiertes und unformatiertes Lesen nicht vermischen sollte.

    Das heißt: Im internen Buffer ist immer noch ein '\n' nicht gelesen worden. Daher blociet peek() nicht, sondern gibt '\n' zurück.

    Kannst du mir jetzt erklären, wieso folgendes Programm (wie von dir erwartet) funktioniert:

    #include <iostream>
    
    using namespace std;
    
    void in_int (int &x) {
        int *y = &x;
        cin >> *y;
    };
    int main () {
        int x;
        in_int (x);
        cout << "\n\n\n" << x;
        // ignoriert den nächsten Befehl
    
        cin.ignore();
        cin.peek ();
    };
    


  • Aha, es funktioniert, wegen dem getline. Das heißt, das eine mögliche Funktion für alle Pausen (ohne system ("pause")) wäre dann:

    void pause () {
       cin.ignore ();
       cin.peek ();
    };
    

    Danke nochmal für eure Hilfe.

    MfG

    Seikuassi


  • Mod

    Seikuassi schrieb:

    Aha, es funktioniert, wegen dem getline. Das heißt, das eine mögliche Funktion für alle Pausen (ohne system ("pause")) wäre dann:

    void pause () {
       cin.ignore ();
       cin.peek ();
    };
    

    Nein nicht wirklich. Schau mal im Archiv des (geschlossenen) Konsolenforums für bessere Lösungen. Die beste Lösung ist jedoch, Konsolenprogramme auch von einer Konsole aus zu benutzen.



  • Hallo,

    Was hälst du von diesem Code?

    cin.ignore(256,'\n'); 
    cin.peek ();
    

    MfG

    Seikuassi



  • Seikuassi schrieb:

    Hallo,

    Was hälst du von diesem Code?

    cin.ignore(256,'\n'); 
    cin.peek ();
    

    MfG

    Seikuassi

    Was hast du genau vor? :p



  • Ok, aber nicht optimal.

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

    wuerde sich besser machen.

    EDIT aber am besten find ich immernoch:

    SeppJ schrieb:

    Die beste Lösung ist jedoch, Konsolenprogramme auch von einer Konsole aus zu benutzen.


  • Mod

    Seikuassi schrieb:

    Hallo,

    Was hälst du von diesem Code?

    cin.ignore(256,'\n'); 
    cin.peek ();
    

    Was ist an 256 anders als an 1?


Anmelden zum Antworten