2016-06-02 103 views
2

so in der Eingabe von Ich nehmeverhindern, dass das Drucken zusätzliche Leerzeichen am Ende meiner Linie C++

string input,word; 
while(getline(cin, input)) { 
stringstream ss; 
ss<<input 
while(ss >> word) 
... 

und Drucken der Sachen, die ich von jedoch cout <<word<<" ";

wollen, wenn ich diese es tun erstellt am Ende jeder Zeile ein zusätzliches Leerzeichen und das möchte ich nicht. Wenn ich diesen Leerraum nicht dort platziere, wird es keine Leerzeichen zwischen Wörtern geben, wenn ich sie ausdrucke. Gibt es eine einfachere Möglichkeit, die Wörter, die ich möchte, so zu gestalten, dass sie automatisch voneinander getrennt sind? Was sind einige der Dinge, die ich tun könnte, um das zusätzliche Leerzeichen am Ende jeder Zeile zu verhindern?

+0

Ähnlich wie folgt aus: https://stackoverflow.com/questions/35858896/c-compare-and-replace-last-character-of-stringstream/35859132# 35859132 und das hier: https://stackoverflow.com/questions/36137997/convert-vectorunsigned-char-1-2-3-into-string-1-2-3-as-digits/36138229#36138229 – Galik

+2

Jetzt gerade Den Weißraum hinter das Wort stellen. Sie können dies beheben, indem Sie das erste Wort außerhalb der while-Schleife drucken und dann das Leerzeichen * vor * jedem Wort ausgeben. Wird das erste Wort getrennt behandelt, wird ein vorangestelltes Leerzeichen vermieden. – aquirdturtle

+0

Wird nicht std :: getline dafür arbeiten? –

Antwort

0

Ein Trick - die immer noch fühlt sich etwas frustrierend - eine boolsche Variable in der Mischung hinzufügt:

bool space = false; 
while (ss >> word) { 
    if (space) { 
     cout << " "; 
    } else { 
     space = true; 
    } 

    cout << word; 
} 
+0

Leider funktioniert das zweite Beispiel nicht. Es zeigt das gleiche Problem. – Galik

+0

Ich habe die erste Methode versucht und ich habe das gleiche Problem. Ich bin mir nicht sicher warum. Sollte die Schleife nicht aufhören, sobald der Eingang stoppt? –

+0

@Galik, danke entfernt. @Gui Montag sollten Sie diesen Code als Ersatz für Ihre 'while (ss >> Wort)' und es sollte keinen Unterschied beim Lesen der Eingabe geben ... – coyotte508

3

-Test das erste Wort Extraktion außerhalb der Schleife, dann weiter um die Schleife mit den führenden Stellen:

std::string input; 
while(getline(std::cin, input)) 
{ 
    std::istringstream ss(input); 
    std::string word; 
    if (ss >> word) 
    { 
     std::cout << word; 
     while (ss >> word) 
      std::cout << ' ' << word; 
     std::cout << '\n'; 
    } 
} 

Hinweis: Zeilenumbruch für Zeilenabschluss hinzugefügt. Verwenden oder löschen Sie nach eigenem Ermessen.

+0

Diese Methode funktioniert nur in einigen Fällen aufgrund der Art von was ich will machen. Nehmen wir an, ich muss nur dann eine neue Zeile erstellen, wenn der Eingang, den ich einlese, ";" wenn ich eine Eingabe habe, die aus mehreren Zeilen mit nur einem Wort besteht, die nicht ";" Ich muss sie in einer Zeile mit einem Leerzeichen zwischen jedem Wort drucken. Wenn ich das tue, haben alle diese Wörter keine Leerzeichen dazwischen. –

+0

@GuiMontag Diese Methode funktioniert für * genau * das Problem, das Ihre Frage beschrieben hat. Wenn Sie etwas anderes brauchen, sollte die Frage das widerspiegeln. In Ihrem Kommentar "Sagen wir, ich brauche .... nur wenn ...", stellt die bloße Anwesenheit von "nur wenn" zusätzliche boolesche Überprüfungen und Aktionen darin dar. Diese Überprüfungen müssen einfach in Code übersetzt werden. – WhozCraig

2

Drehen Sie das Problem um. Anstatt ein Leerzeichen anzuhängen, finde heraus, wann du ein Leerzeichen voranstellen sollst.

Die Art, wie ich dies tun ist, ein Präfix Delimiter zu einem leeren Wert zu initialisieren, dann setzen Sie es auf etwas Gültiges nach dem ersten Element. In Ihrem Fall würde es so sein:

const char *delimiter= ""; 
while(ss >> word) 
{ 
    ss >> delimiter >> word; 
    delimiter= " "; 
} 
+0

Danke, Alter, ich denke, Ihre Lösung hat die meisten meiner Tests bestanden –