std :: cin Eingabe mit Leerzeichen?

144
#include <string>

std::string input;
std::cin >> input;

Der Benutzer möchte "Hello World" eingeben. Aber cinscheitert an der Stelle zwischen den beiden Wörtern. Wie kann ich cindas Ganze aufnehmen Hello World?

Ich mache das eigentlich mit Strukturen und cin.getlinescheint 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?

Zitrone
quelle
27
Sie sollten Ihre Fragen nicht bearbeiten, um neue Fragen zu stellen. Der Grund dafür ist, dass die Leute bereits Antworten auf Ihre ursprüngliche Frage gegeben haben und diese Antworten nun aus dem Zusammenhang geraten. Wenn Ihre ursprüngliche Frage bereits beantwortet wurde, starten Sie einfach eine neue Frage, um Verwirrung zu vermeiden.
Pete
Es ist nach einer kleinen Prüfung offensichtlich, aber könnten Sie bitte eine Deklaration für die Variable hinzufügen library, damit klar ist, dass es vom Typ istcd
Chandsie
Entschuldigung Leute, das wurde in Eile gemacht, ich werde das neu posten.
Zitrone
1
Wenn Sie es als Ersatz erneut veröffentlichen möchten, markieren Sie die Frage zum Löschen durch einen Mod.
Leichtigkeitsrennen im Orbit
2
In Ihrem Update versuchen Sie, getlinein eine int. Das scheitert natürlich.
Ben Voigt

Antworten:

102

Sie müssen verwenden cin.getline():

char input[100];
cin.getline(input,sizeof(input));
Pete
quelle
7
@ Kevin Meh, es passiert. C ++ ist nicht genau so intuitiv, wie wir es uns wünschen.
Pete
61
Ew; warum char-puffer verwenden? Es ist 2011.
Leichtigkeitsrennen im Orbit
3
Und warum nicht verwenden cin.getline(input, sizeof(input));? Sollten Sie auch nicht den Rückgabestatus überprüfen?
Jonathan Leffler
2
@JonathanLeffler Zum Zeitpunkt des Schreibens war dies die Antwort, die ich auf die ursprünglich gestellte Frage hatte (sehen Sie sich den ersten Kommentar zur eigentlichen Frage an und Sie werden sehen, dass sich der Kontext aufgrund einer Bearbeitung durch das OP geändert hat). So oder so, wenn Sie der Meinung sind, dass die Antwort so schrecklich ist, stimmen Sie sie ab. Ich erkenne an, dass dies möglicherweise nicht die "beste" Lösung ist, aber es ist eine Lösung nicht weniger. Anstatt zu fragen, warum ich etwas nicht benutzt habe, könnten Sie uns alle sagen, warum wir es auf Ihre Weise tun sollten.
Pete
7
Ihre Antwort ist nicht schrecklich und muss nicht herabgestimmt werden. Ich denke, zwei kleine Änderungen würden es verbessern. Änderung 1 würde sizeof(input)anstelle von 100 im Aufruf von verwenden cin.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 beispielsweise if (!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.
Jonathan Leffler
215

Es "scheitert" nicht; es hört einfach auf zu lesen. Es sieht ein lexikalisches Token als "Zeichenfolge".

Verwendung std::getline:

int main()
{
   std::string name, title;

   std::cout << "Enter your name: ";
   std::getline(std::cin, name);

   std::cout << "Enter your favourite movie: ";
   std::getline(std::cin, title);

   std::cout << name << "'s favourite movie is " << title;
}

Beachten Sie, dass dies nicht dasselbe ist wie std::istream::getlinebei charPuffern im C-Stil anstelle von std::strings.

Aktualisieren

Ihre bearbeitete Frage hat wenig Ähnlichkeit mit dem Original.

Sie haben versucht, getlinein inteinen Zeichenfolgen- oder Zeichenpuffer zu gelangen. Die Formatierungsvorgänge von Streams funktionieren nur mit operator<<und operator>>. Verwenden Sie entweder eine davon (und passen Sie sie für die Eingabe mehrerer Wörter entsprechend an) oder verwenden Sie sie getlineund konvertieren Sie sie lexikalisch nachträglich int.

Leichtigkeitsrennen im Orbit
quelle
2
Diese Antwort gefällt mir viel besser als die akzeptierte, da ich keine Zeichenlänge angeben muss.
TheWanderer
1
@ TheWanderer Das ist in der Tat ein bedeutender Vorteil.
Leichtigkeitsrennen im Orbit
Denken Sie daran, sstream einzuschließen: #include <sstream>
GilbertS
@LightnessRacesinOrbit, kannst du bitte helfen? Dies gibt mir ohne Grund eine zusätzliche Zeilenumbruch beim Drucken meiner Ausgabe.
Anshuman Kumar
@AnshumanKumar Ich denke, getlinedass die abschließende Newline in die zurückgegebene Zeichenfolge aufgenommen werden kann. Wenn ja, liegt es an Ihnen, es zu löschen.
Mark Ransom
31

Die Standardbibliothek bietet eine Eingabefunktion namens ws, die Leerzeichen aus einem Eingabestream verwendet. Sie können es so verwenden:

std::string s;
std::getline(std::cin >> std::ws, s);
dev gr
quelle
4
Ich denke, das ist die bisher beste Antwort. Ich kann dies mit dem std :: cin >> oben kombinieren.
Andra
1
Beste Antwort bisher. Bei der Verwendung std::getline(std::cin, s)würde ich eine sehr unordentliche und ich würde sagen, unterbrochene Eingabe beim Warten auf Eingaben in einer while/ forSchleife. Diese Option hat mein Problem behoben!
Omerowitz
Include sstream: #include <sstream>
GilbertS
24

Verwenden :

getline(cin, input);

Die Funktion finden Sie in

#include <string>
Gautham Vinod
quelle
2
+1 Dies ist die einzige Antwort, die tatsächlich für mich funktioniert hat. Die restlichen Antworten sagen, dass cin.getline () verwendet werden soll, aber das hat mir nur einen Fehler gegeben, der besagt, dass die Funktion nicht existiert.
Blembo
7
@blembo: Wirklich? Weil meine Antwort, die mehr als drei Jahre vor dieser veröffentlicht wurde, genau dasselbe sagt (im Gegensatz zu dem, was Sie behaupten).
Leichtigkeitsrennen im Orbit
@blembo: Und wenn cin.getlinees 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 ...
Leichtigkeitsrennen im Orbit
13

Sie möchten die .getline-Funktion in cin verwenden.

#include <iostream>
using namespace std;

int main () {
  char name[256], title[256];

  cout << "Enter your name: ";
  cin.getline (name,256);

  cout << "Enter your favourite movie: ";
  cin.getline (title,256);

  cout << name << "'s favourite movie is " << title;

  return 0;
}

Habe das Beispiel von hier genommen . Weitere Informationen und Beispiele finden Sie hier.

Cody
quelle
12
In der Tat möchten Sie selten member- verwenden getline. Es ist veraltet. Verwenden Sie getlinestattdessen kostenlos , was mit verwendet werden kann std::string. [Übrigens, cplusplus.com ist keine empfohlene Ressource]
Leichtigkeitsrennen im Orbit
1
@Tomalak Warum wird cplusplus.com nicht empfohlen? Ich benutze es die ganze Zeit: P
Zitrone
6
@ KevinDuke: Die Tutorials können irreführend und ungenau sein, und die Referenz enthält eine Vielzahl von Fehlern. Das sind gute Ressourcen.
Leichtigkeitsrennen im Orbit
1
@ NickSweeting: Ja; Verwenden Sie dies stattdessen.
Leichtigkeitsrennen im Orbit
1
Für Dokumentationslinks ist cppreference.com ein wirksamer Ersatz für cplusplus.com (beide sind nicht offizielle Paraphrasen)
Ben Voigt
4

DER C-WEG

Sie können getsdie in cstdio gefundene Funktion verwenden (stdio.h in c):

#include<cstdio>
int main(){

char name[256];
gets(name); // for input
puts(name);// for printing 
}

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 sich iostreamselbst verwenden.

#include<iostream>
#include<string>
using namespace std;
int main(){

char name1[256];
string name2;
cin.getline(name1,256); // for input
getline(cin,name2); // for input
cout<<name1<<"\n"<<name2;// for printing
}
abe312
quelle
10
Sehr schlechter Rat, getsist unmöglich sicher zu verwenden. Es wurde sogar vollständig in C11 entfernt.
Mat
1

Ich benutze lieber die folgende Methode, um die Eingabe zu erhalten:

#include <iostream>
#include <string>

using namespace std;

int main(void) {
    string name;

    cout << "Hello, Input your name please: ";
    getline(cin, name);

    return 0;
}

Es ist eigentlich super einfach zu verwenden, anstatt die Gesamtlänge des Arrays für eine Zeichenfolge zu definieren, die ein Leerzeichen enthält.

Rohan Bari
quelle