2016-12-05 4 views
2

Ich schreibe ein Programm, das Eingaben vom Benutzer nimmt. Ich brauche die Eingabe, um Leerzeichen zwischen den Wörtern einzuschließen. Ich habe Probleme, eine Lösung dafür zu finden. Bevor Sie fragen, habe ich mehrere andere Fragen auf Stackoverflow mit der gleichen Frage ausprobiert. Dies sind einige von denen, die ich ausprobiert habe. How to cin Space in c++?C++ Eingabezeichenfolge mit Leerzeichen

std::cin input with spaces?

Demonstration of noskipws in C++

Effect of noskipws on cin>>

Das Problem mit meinem Code ist, dass sobald mein setBusinessName Methode aufgerufen wird, es schließt sich gerade. Es gibt aus und kehrt dann selbst zurück, ohne auf die Eingabe meiner Daten zu warten. Hilfe Required ...

string setBusinessName() 
{ 
    string name = ""; 
    cout << "The name you desire for your business:"; 
    getline(cin, name, '\n'); 
    cout << name; 
    return name; 
} 
+5

Klingt, als könnten Sie '' '' 'und' 'getline' 'mischen. '>>' lässt in der Folge einen ungepackten Whitespace übrig, der oft ein Ende der Linienmarkierung hinterlässt, damit die getline darüber stolpert. Müssen Sie einen [mcve] sehen, um sicher zu sein, dass dies der Fall ist, in den Sie geraten sind. – user4581301

+1

Versuchen Sie diese Änderung: [link] (http://cpp.sh/45q6s) –

Antwort

4

Ich kann noch nicht kommentieren, nicht genug Punkte haben, aber haben Sie versucht cin.ignore(); vor dem getline(cin, name, '\n'); Zugabe?

So:

string setBusinessName() 
{ 
    string name = ""; 
    cout << "The name you desire for your business:"; 
    cin.ignore(); 
    getline(cin, name, '\n'); 
    cout << name; 
    return name; 
} 
+0

Während ich bin mir ziemlich sicher, dass dies das Problem von OP löst, ist dies eine schlechte Idee im allgemeinen Fall. Wenn es im Puffer keinen hängenden Leerraum gibt, haben Sie nur eine gültige Eingabe erhalten. Es ist besser, das 'ignore' nach dem' '' zu setzen, wo du weißt, dass es ein EOL geben sollte und "ignore()" auf 'cin.ignore (numeric_limits :: max(), '\ n');' just um sicher zu sein, dass neben dem EOL auch kein Platz oder etwas anderes herumliegt. – user4581301

-1

Es funktioniert gut. Ich habe es gerade versucht.

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

string setBusinessName(){ 
    string name = ""; 
    cout << "The name you desire for your business:"; 
    getline(cin, name); 
    cout << name; 
    return name; 
} 

int main() { 
    setBusinessName(); 
    system("PAUSE"); 
} 
+0

Was macht das System ("PAUSE")? –

+0

Es pausiert die Ausgabekonsole. Immer wenn ein Ergebnis von Ihrem Programm zurückgegeben wird, hilft es der Ausgabekonsole zu pausieren, bis Sie das Fenster schließen. – Chip

1

Zugabe von nur etwas mehr Erklärung zu den Kommentaren, wenn Sie das tun:

cout << "Enter value:"; 
cin >> x; 

Die cin-Befehl ausgeführt wird, wenn der Benutzer drückteingeben, so dass der Eingangspuffer hat den Wert der Benutzer eingefügt und ein extra '\n' char. Wenn Sie weiterhin tun cin das ist ok, aber wenn Sie getline verwenden möchten (wie in Ihrem Fall Leerzeichen in eine Zeichenfolge enthalten) müssen Sie sich bewusst sein, dass getline beim ersten Auftreten von '\n' im Puffer stoppt, so das Ergebnis von getline wird leer sein.

dies zu vermeiden, und wenn Sie wirklich beide cin und getline verwenden müssen, Sie mithilfe cin.ignore(streamsize n = 1, int delim = EOF) dass '\n' aus dem Puffer entfernen müssen, löscht diese Funktion streamsize Zeichen aus dem Puffer oder bis zum ersten Zeichen, die delim Spiele (einschließlich), hier ein Beispiel:

cin << x; 
cin.ignore(256, '\n'); 
getline(cin, name, '\n'); 

Hinweis es ratsam ist, zu verwenden:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

Wenn Sie nicht wissen möchten, wie viele Zeichen im Puffer sind.

+0

hilfreich - 'std :: cin.ignore()' - http://www.cplusplus.com/forum/beginner/9148/ – parasrish

-1

Es ist möglich, dass bereits etwas im Stream vorhanden ist und getline() es gerade liest.

Stellen Sie sicher, dass Sie vor dieser Funktion cin>> nicht verwendet haben. Und Sie können cin.ignore() vor getline() verwenden, um zu vermeiden, dass bereits etwas im Stream existiert.

Verwandte Themen