Pergunta

Eu tenho tentado usar a classe C ++ StringStream para fazer algumas manipulações de cordas relativamente simples, mas estou tendo um problema com o método get (). Por algum motivo, sempre que eu extraí o caractere de saída por caractere, ele anexa uma segunda cópia da letra final.

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

A saída do programa é:

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

Qualquer ajuda que você possa me dar sobre isso seria apreciada.

Foi útil?

Solução

No final do fluxo ss.eof() Ainda não sabe que o final do fluxo será alcançado em breve, mas a extração a seguir de um personagem falha. Desde que a extração falhou porque o final do fluxo foi alcançado, c não é alterado. Seu programa não reconhece isso ss.get(c) falhou e imprime esse valor antigo de c novamente.

Uma maneira melhor de verificar se ainda existe um personagem que possa ser lido no fluxo seria um loop como este:

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

Outras dicas

é por causa da ordem do loop. Sua leitura do 0 e EOF.

reordenar seu código como este

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

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

O sinalizador EOF é definido apenas se você tentar ler além do final do arquivo. O código a seguir corrige o problema testando o EOF após o get () em vez de antes dele:

#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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top