#include <string>
std::string input;
std::cin >> input;
Der Benutzer möchte "Hello World" eingeben. Aber cin
scheitert an der Stelle zwischen den beiden Wörtern. Wie kann ich cin
das Ganze aufnehmen Hello World
?
Ich mache das eigentlich mit Strukturen und cin.getline
scheint nicht zu funktionieren. Hier ist mein Code:
struct cd
{
std::string CDTitle[50];
std::string Artist[50];
int number_of_songs[50];
};
std::cin.getline(library.number_of_songs[libNumber], 250);
Dies ergibt einen Fehler. Irgendwelche Ideen?
library
, damit klar ist, dass es vom Typ istcd
getline
in eineint
. Das scheitert natürlich.Antworten:
Sie müssen verwenden
cin.getline()
:quelle
char
-puffer verwenden? Es ist 2011.cin.getline(input, sizeof(input));
? Sollten Sie auch nicht den Rückgabestatus überprüfen?sizeof(input)
anstelle von 100 im Aufruf von verwendencin.getline()
; Das würde bedeuten, dass Sie die Größe des Eingabepuffers ändern können und nur eine Zeile anstelle von zwei Zeilen ändern müssen. Änderung 2 besteht darin, die Rückgabe zu testen,cin.getline()
indem beispielsweiseif (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }
oder ähnliches verwendet wird, um das OP daran zu erinnern, dass insbesondere Eingabeoperationen für unerwartetes Verhalten anfällig sind. Andere Antworten brauchen das auch.Es "scheitert" nicht; es hört einfach auf zu lesen. Es sieht ein lexikalisches Token als "Zeichenfolge".
Verwendung
std::getline
:Beachten Sie, dass dies nicht dasselbe ist wie
std::istream::getline
beichar
Puffern im C-Stil anstelle vonstd::string
s.Aktualisieren
Ihre bearbeitete Frage hat wenig Ähnlichkeit mit dem Original.
Sie haben versucht,
getline
inint
einen Zeichenfolgen- oder Zeichenpuffer zu gelangen. Die Formatierungsvorgänge von Streams funktionieren nur mitoperator<<
undoperator>>
. Verwenden Sie entweder eine davon (und passen Sie sie für die Eingabe mehrerer Wörter entsprechend an) oder verwenden Sie siegetline
und konvertieren Sie sie lexikalisch nachträglichint
.quelle
getline
dass die abschließende Newline in die zurückgegebene Zeichenfolge aufgenommen werden kann. Wenn ja, liegt es an Ihnen, es zu löschen.Die Standardbibliothek bietet eine Eingabefunktion namens
ws
, die Leerzeichen aus einem Eingabestream verwendet. Sie können es so verwenden:quelle
std::getline(std::cin, s)
würde ich eine sehr unordentliche und ich würde sagen, unterbrochene Eingabe beim Warten auf Eingaben in einerwhile
/for
Schleife. Diese Option hat mein Problem behoben!Verwenden :
Die Funktion finden Sie in
quelle
cin.getline
es auf Ihrem System nicht existiert, haben Sie etwas sehr Falsches getan. Höchstwahrscheinlich haben Sie die falschen Argumente übergeben. Am besten beschuldigen Sie nicht andere für Ihre Fehler ...Sie möchten die .getline-Funktion in cin verwenden.
Habe das Beispiel von hier genommen . Weitere Informationen und Beispiele finden Sie hier.
quelle
getline
. Es ist veraltet. Verwenden Siegetline
stattdessen kostenlos , was mit verwendet werden kannstd::string
. [Übrigens, cplusplus.com ist keine empfohlene Ressource]DER C-WEG
Sie können
gets
die in cstdio gefundene Funktion verwenden (stdio.h in c):DER C ++ WEG
gets
wird in c ++ 11 entfernt.[Empfohlen]: Sie können getline (cin, name) in
string.h
oder cin.getline (name, 256) in sichiostream
selbst verwenden.quelle
gets
ist unmöglich sicher zu verwenden. Es wurde sogar vollständig in C11 entfernt.Ich benutze lieber die folgende Methode, um die Eingabe zu erhalten:
Es ist eigentlich super einfach zu verwenden, anstatt die Gesamtlänge des Arrays für eine Zeichenfolge zu definieren, die ein Leerzeichen enthält.
quelle