Frage

Ich habe versucht, die C ++ Klasse string zu verwenden, um einige relativ einfache String-Manipulationen zu tun, aber ich habe ein Problem mit der Methode get () mit. Aus irgendeinem Grund, wenn ich die Ausgabe zeichenweise extrahieren anhängt es eine zweite Kopie des letzten Brief.

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

int main() {
   stringstream ss("hello");
   char c;

   while(!ss.eof()) {
      ss.get(c);
      cout << "char: " << c << endl;
   }
   return 0;
}

Die Ausgabe aus dem Programm ist:

char: h
char: e
char: l
char: l
char: o
char: o

Jede Hilfe können Sie mir geben, auf diesem würde geschätzt.

War es hilfreich?

Lösung

Am Ende des Stroms ss.eof() weiß noch nicht, dass das Ende des Stroms bald erreicht sein wird, aber die nach der Extraktion eines Zeichen versagt. Da die Extraktion, da das Ende des Stroms fehlgeschlagen wurde erreicht, wird c nicht verändert. Ihr Programm nicht, dass ss.get(c) nicht erkannt und druckt die alte Wert von c wieder.

Eine bessere Möglichkeit, zu überprüfen, ob es noch ein Charakter ist, die aus dem Stream gelesen werden können, wäre eine Schleife so aussehen:

while (ss.get(c)) {
   cout << "char: " << c << endl;
}

Andere Tipps

sein wegen der Ordnung der Schleife. Ihre Lektüre der \ 0 und EOF.

Neuordnungs Code wie folgt

int main() {
   stringstream ss("hello");
   char c;

   ss.get(c);
   while(!ss.eof()) {
      cout << "char: " << c << endl;
      ss.get(c);
   }
   return 0;
}

Der EOF-Flag wird nur gesetzt, wenn Sie versuchen, über das Ende der Datei zu lesen. Der folgende Code behebt das Problem, indem sie nach dem get für EOF Prüfung () statt, bevor es:

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

int main() {
   stringstream ss("hello");
   char c;

   while(1) {
      ss.get(c);
      if(ss.eof())
          break;

      cout << "char: " << c << endl;
   }
   return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top