std::cin Eingabe mit Leerzeichen?

Lesezeit: 7 Minuten

stdcin Eingabe mit Leerzeichen
Herzogin

#include <string>

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

Der Benutzer möchte “Hello World” eingeben. Aber cin scheitert am Leerzeichen zwischen den beiden Wörtern. Wie kann ich machen cin das Ganze aufnehmen Hello World?

Ich mache das eigentlich mit Structs 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?

  • Sie sollten Ihre Fragen nicht bearbeiten, um solche neuen Fragen zu stellen. Der Grund dafür ist, dass die Leute bereits Antworten auf Ihre ursprüngliche Frage gegeben haben und diese Antworten jetzt aus dem Zusammenhang gerissen zu sein scheinen. Wenn Ihre ursprüngliche Frage bereits beantwortet wurde, beginnen Sie einfach mit einer neuen Frage, um Verwirrung zu vermeiden.

    – Peter

    30. April 2011 um 1:26 Uhr

  • Es ist nach einer kleinen Untersuchung offensichtlich, aber könnten Sie bitte eine Deklaration für die Variable hinzufügen library damit klar ist, dass es sich um den Typ handelt cd

    – Candsie

    30. April 2011 um 1:30 Uhr


  • Entschuldigung Leute, das war in Eile, ich werde das reposten.

    – Herzogin

    30. April 2011 um 1:38 Uhr

  • Wenn Sie es als Ersatz erneut veröffentlichen möchten, markieren Sie die Frage bitte zum Löschen durch einen Mod.

    – Leichtigkeitsrennen im Orbit

    30. April 2011 um 2:03 Uhr

  • In Ihrem Update versuchen Sie es getline In ein int. Das schlägt natürlich fehl.

    – Ben Voigt

    28. August 2013 um 18:38 Uhr

1647269409 524 stdcin Eingabe mit Leerzeichen
Leichtigkeitsrennen im Orbit

Es „versagt“ nicht; es hört einfach auf zu lesen. Es sieht ein lexikalisches Token als eine “Zeichenfolge”.

Verwenden std::getline:

#include <string>
#include <iostream>

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 der Fall ist nicht das Gleiche wie std::istream::getlinedie mit C-Stil funktioniert char Puffer statt std::stringS.

Aktualisieren

Ihre bearbeitete Frage hat wenig Ähnlichkeit mit dem Original.

Du hast es versucht getline In ein int, kein Zeichenfolgen- oder Zeichenpuffer. Die Formatierungsoperationen von Streams funktionieren nur mit operator<< und operator>>. Verwenden Sie entweder einen von ihnen (und optimieren Sie ihn entsprechend für die Eingabe mehrerer Wörter) oder verwenden Sie getline und lexikalisch umwandeln in int nach dem Fakt.

  • Diese Antwort gefällt mir viel besser als die akzeptierte, da ich keine Zeichenlänge angeben muss.

    – Der Wanderer

    7. September 2018 um 19:35 Uhr

  • @TheWanderer Das ist in der Tat ein erheblicher Vorteil.

    – Leichtigkeitsrennen im Orbit

    10. September 2018 um 10:34 Uhr

  • @LightnessRacesinOrbit, kannst du bitte helfen? Dies gibt mir ohne Grund einen zusätzlichen Zeilenumbruch, während ich meine Ausgabe drucke.

    – Anshuman Kumar

    25. Juni 2020 um 13:34 Uhr

  • @ AnshumanKumar denke ich getline kann den abschließenden Zeilenumbruch in der zurückgegebenen Zeichenfolge enthalten. Wenn ja, liegt es an Ihnen, es zu löschen.

    – Markieren Sie Lösegeld

    16. Juli 2020 um 16:50 Uhr

stdcin Eingabe mit Leerzeichen
Peter

Sie müssen verwenden cin.getline():

char input[100];
cin.getline(input,sizeof(input));

  • @Kevin Meh, es passiert. C++ ist nicht genau so intuitiv, wie wir es gerne hätten.

    – Peter

    30. April 2011 um 0:54 Uhr

  • Ei; warum verwenden char– Puffer? Es ist 2011.

    – Leichtigkeitsrennen im Orbit

    30. April 2011 um 2:03 Uhr

  • Und warum nicht verwenden cin.getline(input, sizeof(input));? Sollten Sie nicht auch den Rückgabestatus überprüfen?

    – Jonathan Leffler

    14. Juni 2013 um 23:32 Uhr


  • @JonathanLeffler Als dies geschrieben wurde, war dies die Antwort, die ich auf die ursprünglich gestellte Frage hatte (sehen Sie sich den ersten Kommentar für die eigentliche Frage an und Sie werden sehen, dass sich der Kontext aufgrund einer Bearbeitung durch das OP geändert hat). Wie auch immer, wenn Sie der Meinung sind, dass die Antwort so schrecklich ist, stimmen Sie sie ab. Ich erkenne an, dass dies vielleicht nicht die “beste” Lösung ist, aber es ist eine Lösung nicht weniger. Anstatt zu fragen, warum ich etwas nicht verwendet habe, könnten Sie uns allen sagen, warum wir es auf Ihre Weise tun sollten.

    – Peter

    14. Juni 2013 um 23:50 Uhr

  • Ihre Antwort ist nicht schrecklich und muss nicht herabgestuft werden. Ich denke, zwei kleine Änderungen würden es verbessern. Änderung 1 würde verwenden sizeof(input) anstelle von 100 im Aufruf an 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 wäre, die Rücksendung zu testen cin.getline() indem Sie zum Beispiel if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... } oder etwas Ähnliches, um das OP daran zu erinnern, dass insbesondere Eingabeoperationen anfällig für unerwartetes Verhalten sind. Andere Antworten brauchen dies auch.

    – Jonathan Leffler

    15. Juni 2013 um 0:23 Uhr


stdcin Eingabe mit Leerzeichen
Entwickler gr

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

std::string s;
std::getline(std::cin >> std::ws, s);

  • Ich denke, das ist bisher die beste Antwort. Ich kann dies mit dem std::cin>> oben kombinieren.

    – Andrea

    24. Oktober 2018 um 18:08 Uhr

  • Beste Antwort bisher. Beim Benutzen std::getline(std::cin, s) Ich würde eine sehr unordentliche und ich würde sagen, unterbrochene Eingabe beim Warten auf Eingaben in einem bekommen while/for Schleife. Diese Option hat mein Problem gelöst!

    – Zlatan Omerović

    8. Januar 2020 um 20:27 Uhr

  • Sstream einschließen: #include

    – GilbertS

    7. Februar 2020 um 9:45 Uhr

Verwenden :

getline(cin, input);

Die Funktion ist in zu finden

#include <string>

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 genommen Hier. Weitere Informationen und Beispiele finden Sie hier.

  • Tatsächlich möchten Sie nur selten Mitglieds-getline. Es ist veraltet. Kostenlos nutzen getline stattdessen, die mit verwendet werden können std::string. [BTW, cplusplus.com is not a recommended resource]

    – Leichtigkeitsrennen im Orbit

    30. April 2011 um 2:05 Uhr


  • @Tomalak Warum wird cplusplus.com nicht empfohlen? Ich benutze es die ganze Zeit 😛

    – Herzogin

    30. April 2011 um 3:20 Uhr

  • @KevinDuke: Die Tutorials können irreführend und ungenau sein, und die Referenz enthält eine Vielzahl von Fehlern. Diese sind gute Quellen.

    – Leichtigkeitsrennen im Orbit

    30. April 2011 um 11:57 Uhr

  • @NickSweeting: Ja; Verwenden Sie stattdessen diese.

    – Leichtigkeitsrennen im Orbit

    4. April 2014 um 15:51 Uhr

  • Für Dokumentationslinks ist cppreference.com ein effektiver Ersatz für cplusplus.com (beide sind nicht offizielle Paraphrasen).

    – Ben Voigt

    10. Juli 2014 um 23:02 Uhr


DER C-WEG

Sie können verwenden gets Funktion gefunden in cstdio (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.

[Recommended]:Sie können verwenden getline(cin,name) welches ist in string.h
oder cin.getline(name,256) welches ist in iostream selbst.

#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
}

  • Tatsächlich möchten Sie nur selten Mitglieds-getline. Es ist veraltet. Kostenlos nutzen getline stattdessen, die mit verwendet werden können std::string. [BTW, cplusplus.com is not a recommended resource]

    – Leichtigkeitsrennen im Orbit

    30. April 2011 um 2:05 Uhr


  • @Tomalak Warum wird cplusplus.com nicht empfohlen? Ich benutze es die ganze Zeit 😛

    – Herzogin

    30. April 2011 um 3:20 Uhr

  • @KevinDuke: Die Tutorials können irreführend und ungenau sein, und die Referenz enthält eine Vielzahl von Fehlern. Diese sind gute Quellen.

    – Leichtigkeitsrennen im Orbit

    30. April 2011 um 11:57 Uhr

  • @NickSweeting: Ja; Verwenden Sie stattdessen diese.

    – Leichtigkeitsrennen im Orbit

    4. April 2014 um 15:51 Uhr

  • Für Dokumentationslinks ist cppreference.com ein effektiver Ersatz für cplusplus.com (beide sind nicht offizielle Paraphrasen).

    – Ben Voigt

    10. Juli 2014 um 23:02 Uhr


1647269410 439 stdcin Eingabe mit Leerzeichen
Aufbau erfolgreich

Wie lese ich eine Zeichenfolge aus der Eingabe?

Sie können ein einzelnes, mit Leerzeichen abgeschlossenes Wort mit lesen std::cin so was:

#include<iostream>
#include<string>
using namespace std;

int main()
{
    cout << "Please enter a word:\n";

    string s;
    cin>>s;

    cout << "You entered " << s << '\n';
}

Beachten Sie, dass es keine explizite Speicherverwaltung und keinen Puffer mit fester Größe gibt, der möglicherweise überlaufen könnte. Wenn Sie wirklich eine ganze Zeile (und nicht nur ein einzelnes Wort) benötigen, können Sie dies tun:

#include<iostream>
#include<string>
using namespace std;

int main()
{
    cout << "Please enter a line:\n";

    string s;
    getline(cin,s);

    cout << "You entered " << s << '\n';
}

1001990cookie-checkstd::cin Eingabe mit Leerzeichen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy