Как использовать Input String Stream с символами, разделяющими строки вместо пробелов? - PullRequest
0 голосов
/ 23 января 2019

примечание: я только что узнал о 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 Ответ

0 голосов
/ 23 января 2019

Бесплатная функция 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, у вас может быть несколько символов, которые будут интерпретироваться как пробел.

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

...