Question

Je suis tenté d'utiliser la classe stringstream C ++ pour faire quelques manipulations de chaînes relativement simples, mais je suis un problème avec la méthode get (). Pour une raison quelconque chaque fois que j'extraire le caractère de sortie par le caractère d'une seconde, il ajoute une copie de la lettre finale.

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

La sortie du programme est le suivant:

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

Toute aide que vous pouvez me donner ce serait apprécié.

Était-ce utile?

La solution

A la fin du flux ss.eof() ne sait pas encore que la fin du flux sera bientôt atteint, mais l'extraction suivante d'un caractère échoue. Depuis l'extraction a échoué parce que la fin du cours d'eau a été atteint, c ne change pas. Votre programme ne reconnaît pas que ss.get(c) a échoué et imprime cette vieille valeur de c à nouveau.

Une meilleure façon de vérifier s'il y a encore un caractère qui peut être lu à partir du flux serait une boucle comme ceci:

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

Autres conseils

sa cause de l'ordre de la boucle. Votre lecture du \ 0 et EOF.

réordonner votre code comme ceci

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

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

Le drapeau EOF est défini si vous ne tentez de lire après la fin du fichier. Le code suivant résout le problème en testant EOF après get () au lieu de devant elle:

#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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top