Строковый поток С++, возвращающий дополнительный символ?

StackOverflow https://stackoverflow.com/questions/1541275

  •  20-09-2019
  •  | 
  •  

Вопрос

Я пытался использовать класс stringstream C++ для выполнения некоторых относительно простых манипуляций со строками, но у меня возникла проблема с методом get().По какой-то причине всякий раз, когда я извлекаю выходной символ за символом, он добавляет вторую копию последней буквы.

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

Результатом работы программы является:

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

Любая помощь, которую вы можете мне оказать в этом вопросе, будет оценена по достоинству.

Это было полезно?

Решение

В конце потока ss.eof() еще не знает, что конец потока скоро будет достигнут, но последующее извлечение символа не удается.Поскольку извлечение не удалось из-за достижения конца потока, c не изменен.Ваша программа этого не распознает ss.get(c) не удалось и печатает это старое значение c снова.

Лучшим способом проверить, есть ли еще символ, который можно прочитать из потока, будет такой цикл:

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

Другие советы

это из-за порядка цикла.Вы читаете \0 и EOF.

измените порядок вашего кода следующим образом

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

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

Флаг EOF устанавливается только в том случае, если вы пытаетесь прочитать ПОСЛЕ конца файла.Следующий код устраняет проблему, проверяя наличие EOF после get(), а не перед ним:

#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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top