|
You last visited: Today at 23:23
Advertisement
getline() - Ließt beim Ausführen keine Textzeile ein
Discussion on getline() - Ließt beim Ausführen keine Textzeile ein within the C/C++ forum part of the Coders Den category.
06/09/2012, 15:08
|
#1
|
elite*gold: 80
Join Date: Oct 2007
Posts: 189
Received Thanks: 21
|
getline() - Ließt beim Ausführen keine Textzeile ein
Hey, ich bins wieder .__.
Ich habe nun das folgende Probleme und zwar beim ausführen meines Übungsprogramms ruft er die Funktion getline() nicht auf.
Anstatt dass,das Programm auf eine Eingabe wartet, ruft es die zweite Funktion auf in dem Fall die Ausgabe des Textes.
// Bitte beachtet, dass sich hierbei nur um ein Übungsprogramm handelt
PHP Code:
#include <iostream> #include <iomanip> #include <string>
using namespace std;
int main() { string text1("Feldbreite"), linie(40, '~'), vorname, nachname, hallo("Hallo, Herr "), begrueßung; int zahl1, zahl2, zahl3;
cout << "Geben sie eine ganze Zahl ein." << endl; cin >> zahl1; cout << "Sie haben die Zahl: " << zahl1 << " eingegeben." << endl; cout << "Die Zahl in Hexadezimale Darstellung: " << hex << zahl1 << endl; cout << "Die Zahl in Oktale Darstellung: " << oct << zahl1 << endl; cout << "Die Zahl in Dezimale Darstellung: " << dec << zahl1 << endl; cout << "Die Zahl mit Vorzeichen: " << showpos << zahl1 << endl; cout << "Die Hexadezimale Darstellung in gross: " << uppercase << hex << zahl1 << endl; cout << linie << endl; cout << "Uebersichtlicher" << endl; cout << "Hexadezimal\t\tOktale\t\tDezimal\t\t" << endl; cout << "\t" << nouppercase << hex << zahl1 << "\t" << "\t" << oct << zahl1 << "\t" << "\t" << dec << zahl1 << "\t" << endl; // Fragen nach persönlichen Dingen und erneut abrufen cout << linie << endl; cout << linie << endl; cout << "Könnten sie ihren Nachnamen eingeben? " << endl; //Frage 1 getline(cin, nachname); cout << "Jetzt noch ihren Vornamen bitte: " << endl; //Frage 2 getline(cin, vorname); begrueßung = hallo + vorname + nachname; cout << begrueßung << endl; return 0; }
Das Programm führt er auch ohne jegliche Fehlermeldungen aus.
Aber wenn ich die Funktion getline() über Frage1 & Frage 2 hinsetze, wartet er auf eine Eingabe aber gibt das Objekt "begrueßung" nicht korrekt aus.
|
|
|
06/09/2012, 15:39
|
#2
|
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
|
Versuch mal nach cin >> zahl1 den Eingabepuffer
mittels fflush(stdin) zu löschen.
|
|
|
06/09/2012, 15:56
|
#3
|
elite*gold: 80
Join Date: Oct 2007
Posts: 189
Received Thanks: 21
|
Quote:
Originally Posted by .SkyneT.
Versuch mal nach cin >> zahl1 den Eingabepuffer
mittels fflush(stdin) zu löschen.
|
Wow...perfekt es hat auf anhieb funktioniert.
Könntest du mir sagen, was da nun das exakte Problem war ?
|
|
|
06/09/2012, 18:16
|
#4
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Das kommt weil du cin mit getline mischen tust.
Lass mich das kurz verdeutlichen:
Code:
Operation Eingabestream
cin >> zahl1
1234\n
\n
getline(cin, nachname) \n
\nSchmitz\n
Schmitz\n
std::cin ließt nicht bis zum \n, wodurch das im Stream stehen bleibt. std::getline ließt bis zum \n und da das noch am Anfang des Streams steht ließt es nichts.
|
|
|
06/09/2012, 22:35
|
#5
|
elite*gold: 80
Join Date: Oct 2007
Posts: 189
Received Thanks: 21
|
Mischen tue ich das zwar nicht aber im Buch wurde eben nie was von solchen Eingabepuffern erwähnt.
Ich habe mich zwar immer gefragt, warum man getline macht, wenn die Elementfunktion "cin" gibt, aber das es noch was mit dem Zwischenspeicher zu tun hat...hm..
Also nach jedem cin(falls ein getline() folgt) sollte ich den Puffer löschen oder?
Wenn ich das aus dem Zwischenspeicher gelöscht habe, verändert sich überhaupt etwas am Programm oder hat es irgendwelche Auswirkungen?
Frage1: Ich habe zwar verstanden wo nun das Problem liegt, aber wann ich getline oder cin mache verstehe ich noch immer nicht so ganz.
Wann benutzt man es letztendlich?
Frage2: getline() wartet also auf die Return-Taste schlussendlich auf das \n und cin ließt aber die ganze Eingabe nur nicht die Leerzeichen stimmts?
Ich habe jetzt mal etwas im Internet gesucht, nach den Stichworten, wann getline() oder cin aber ich werde zu keiner Lösung fündig.
Könnte mir jemand da etwas behilflich sein und meine Fragen beantworten?
|
|
|
06/10/2012, 00:29
|
#6
|
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
|
Quote:
Originally Posted by dunkis
Mischen tue ich das zwar nicht aber im Buch wurde eben nie was von solchen Eingabepuffern erwähnt.
Ich habe mich zwar immer gefragt, warum man getline macht, wenn die Elementfunktion "cin" gibt, aber das es noch was mit dem Zwischenspeicher zu tun hat...hm..
Also nach jedem cin(falls ein getline() folgt) sollte ich den Puffer löschen oder?
Wenn ich das aus dem Zwischenspeicher gelöscht habe, verändert sich überhaupt etwas am Programm oder hat es irgendwelche Auswirkungen?
Frage1: Ich habe zwar verstanden wo nun das Problem liegt, aber wann ich getline oder cin mache verstehe ich noch immer nicht so ganz.
Wann benutzt man es letztendlich?
Frage2: getline() wartet also auf die Return-Taste schlussendlich auf das \n und cin ließt aber die ganze Eingabe nur nicht die Leerzeichen stimmts?
Ich habe jetzt mal etwas im Internet gesucht, nach den Stichworten, wann getline() oder cin aber ich werde zu keiner Lösung fündig.
Könnte mir jemand da etwas behilflich sein und meine Fragen beantworten?
|
Code:
string str_cin, str_getline;
std::cin >> str_cin;
fflush(stdin);
std::getline (cin, str_getline);
std::cout << str_cin << str_getline;
Dann gib einfach mal ein paar Strings, mit und ohne Leerzeichen ein,
und dann weißt du sicher warum man getline/cin verwendet
|
|
|
06/10/2012, 01:44
|
#7
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Das flushen des Eingabestreams ruft undefined behavior hervor. Es kann funktionieren, muss aber nicht.
Sauber geht es mit
Code:
char ch;
while ((ch = cin.get()) != '\n' && ch != EOF);
|
|
|
06/10/2012, 02:23
|
#8
|
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
|
Quote:
Originally Posted by Nightblizard
Das flushen des Eingabestreams ruft undefined behavior hervor.
|
Gibt es dafür auch ein konkretes Beispiel ?
Bisher konnte ich nie etwas ungewöhnliches bzgl des
flushen des Eingabestreams feststellen.
Quote:
Sauber geht es mit
Code:
char ch;
while ((ch = cin.get()) != '\n' && ch != EOF);
|
Das will ich damit aber nicht schlechtreden, ist sicher die
sicherere Art
|
|
|
06/10/2012, 08:23
|
#9
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
So spontan kenne ich da keines, da ich unsicheren Code in der Regel vermeide.
Wichtig ist folgendes:
Quote:
|
If the given stream was open for writing and the last i/o operation was an output operation, any unwritten data in the output buffer is written to the file.
|
Es kann funktionieren, es kann aber auch ein schwarzes Loch erzeugen und Nibiru aus alternativen Dimension erscheinen lassen und alles Leben vernichten. Undefined behavior, lass' es erst nicht drauf ankommen, vorallem nicht 2012. :P
|
|
|
06/10/2012, 11:17
|
#10
|
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
|

Kurz gesagt, es ist nicht Standart, es funktioniert aber mit VC++.
Also unter Linux erscheint Nibiru ^^
|
|
|
06/20/2012, 00:02
|
#11
|
elite*gold: 80
Join Date: Oct 2007
Posts: 189
Received Thanks: 21
|
Kann ich nicht einfach den Befehl:
PHP Code:
cin.sync(); // und cin.clear();
benutzen?
|
|
|
06/20/2012, 06:49
|
#12
|
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
|
Clear ist denk ich nur nach Fehlern sinnvoll, wenn du den State des Streams zurücksetzen willst. Kann aber sein das ich da daneben liege. Edit: Ok, sollte man sicherheitshalber machen ^^
Das cin.sync() ist ungefähr so Standart wie fflush(stdin), soweit ich weiß.
Also wenn du sichergehen willst, benutze Nightblizard's Methode.
|
|
|
06/20/2012, 09:08
|
#13
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
cin.sync ist implementationsabhängig. Sprich, in Visual Studio kann es alle ungelesenen Zeichen vom Inputstream lesen und der Borland Compiler ließt z.B. nur 20 Zeichen.
Sprich, keine richtige Lösung.
cin.clear setzt lediglich den Status des Streams zurück.
Kann funktionieren, muss aber nicht. Schau nach wie dein Compiler das umsetzt.
Eine weitere Alternative zu meinem Beispiel wäre:
std::cin.ignore(std::numeric_limits<std::streamsiz e>::max(), '\n');
Das liesst entweder std::numeric_limits<std::streamsize>::max() (9.223.372.036.854.775.807 in VS11 Beta) Zeichen vom Stream oder bis zum newline. Der Vorteil davon ist, dass du angeben kannst wie viele Zeichen übersprungen werden sollen. Der Nachteil ist, falls - rein theoretisch - mehr Zeichen im Stream sind, als streamsize Zahlen darstellen kann, dann wird das auch nicht den gewünschten Effekt haben.
|
|
|
06/20/2012, 12:41
|
#14
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
In dem Fall würde aber ein gehöriger Fehler im Standard vorliegen, denn eigentlich sollte sichergestellt werden, dass die Größe des Streams auch durch streamsize dargestellt werden kann.
|
|
|
06/20/2012, 16:27
|
#15
|
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
|
Hier hätte ich nen Link dazu, mir ist das jetzt aber selber noch nicht ganz klar, jedenfalls hat streamsize garantiert mindestens 2 Byte hab ich gelesen, wobei das ja doch keine Rolle spielt(?).
Edit: Weil es dann doch den ganzen Stream verwendet, mein ich ^^
|
|
|
 |
|
Similar Threads
|
Kann keine Pserver exe-Dateien ausführen!
04/21/2012 - Metin2 Private Server - 2 Replies
Moin Com,
Ich kann seit ca. 4 Tagen keine .exe-Dateien von Metin2-Pservern mehr ausführen. Wenn ich Doppelklick auf eine mache passsiert nichts. Über den Patcher geht auch nichts. Allerdings kann ich nur die Server nicht starten, die ich in dem Zeitraum von 01.04-04.04 gepatcht oder runtergeladen hab. Ein alter Pserver, den ichnoch drauf habe funktioniert ebenso der .de Offi. hat jemand eine Ahnung, was ich da machen kann? :S
LG
|
[FEHLER]Beim Ausführen von Make.sh
12/11/2011 - Metin2 Private Server - 3 Replies
Hallo Leute,
Ich brauche eure Hilfe, undzwar habe ich einen Fehler wenn ich den Code:
ausführe.
Es erscheint:
|
Fehler beim Ausführen des Installers
04/16/2011 - Metin2 Private Server - 0 Replies
Hey Community,
ich habe ein Problem mit meinem neuen Installer, und ich kann
leider keinen Fehler finden(was wahrscheinlich daran liegt, dass ich
recht müde bin).
Nun wollte ich euch fragen, wieso der Error
2P22# sh install.sh
install.sh: 80: Syntax error: "elif" unexpected (expecting "then")
2P22#
kommt. Ich hab mir das Script angeschaut, und keine Fehler gefunden.
Hier ist der Sourcecode:
|
Keine Berechtigung beim Ausführen als Admin? / Rechte übertragen [TuT]
02/14/2011 - S4 League Hacks, Bots, Cheats & Exploits - 3 Replies
Da manche nicht die Berechtigung verfügen um einen Hack als Admin auszuführen, hier mal ein simples Tutorial um sie die Rechte zu verschaffen
1. Start -> Ausführen -> CMD
2. Ein schwarzes Fenster öffnet sich.
3. eingeben:
net localgroup administrators /add (deinen Nutzernamen)
4. ggf. PC neustarten und fertig
Hier auch noch ein Video dazu:
|
Problem beim make.sh ausführen!
12/30/2009 - Metin2 Private Server - 10 Replies
Es gibt da so einen Thread wo erklärt wird wie man make.sh ausführt
(braucht man um etwas in deutsche übersetzte wirksam zu machen)
Ich hab's genauso gemacht wie da und das sieht jetzt so aus:
Directupload.net - D7iurojyi.jpg
|
All times are GMT +1. The time now is 23:23.
|
|