Как использовать Input String Stream с символами, разделяющими строки вместо пробелов?

Примечание : я только что узнал о Getline и Streams.

Вместо пробела, разделяющего имя, фамилию и возраст, как я могу разделить их с помощью ^ или -?

Есть ли функция для этого? Это глупый вопрос, и если да, то почему?

-Причина этого вопроса в том, что я собирался создать функцию для решения полиномиальных производных и потерпел неудачу.

int main() {
  istringstream inSS;       // Input string stream
  string lineString;        // Holds line of text
  string firstName;         
  string lastName;         
  int    userAge;          


  getline(cin, lineString);


  inSS.str(lineString);


  inSS >> firstName;
  inSS >> lastName;
  inSS >> userAge;

  return 0;
}

1 ответ

Свободная функция getline также предлагает иметь пользовательский разделитель, как сказал user4581301. Тем не менее, он будет только извлекать stringс, и у вас также есть int,

Подобное решение можно найти в этом ответе, и я изменил код в соответствии с вашими потребностями: изменив разделитель для cin (C++)

Ты можешь использовать imbue иметь некоторый пользовательский разделитель. Простой пример ниже:

#include <locale>
#include <iostream>

template<char Delim>
struct alternativeDelimiter : std::ctype<char> {
  alternativeDelimiter() : std::ctype<char>(get_table()) {}

  static mask const* get_table()
  {
    static mask rc[table_size];
    rc[Delim] = std::ctype_base::space;
    return &rc[0];
  }
};

int main() {
  using std::string;
  using std::cin;
  using std::locale;

  cin.imbue(locale(cin.getloc(), new alternativeDelimiter<'^'>));

  string word;
  while(cin >> word) {
    std::cout << word << "\n";
  }
}

imbue берет на себя ответственность за ctypeтак что не беспокойтесь о звонке, удалите себя.

Если вы введете some^text, вывод будет

some
text

Вы также можете использовать это с вашим примером, конечно.

Если вы расширите таблицу, написав строки, аналогичные строке 11 (rc[Delim] = std::ctype_base::space) только меняется Delim, вы можете иметь несколько символов, которые будут интерпретироваться как пробел.

Я не уверен, насколько это решает вашу первоначальную проблему написания математического парсера. Общая терминология включает в себя понятия "анализатор" и "лексер", и вы можете исследовать эти концепции для создания надежного математического решателя. Надеюсь, это тоже поможет.

Другие вопросы по тегам