Wieder zwei unsinnige Funktionen!
-
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):
-
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
-
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.
-
Seikuassi schrieb:
Hallo,
Was hälst du von diesem Code?
cin.ignore(256,'\n'); cin.peek ();Was ist an 256 anders als an 1?