如何使用带符号分隔字符串而不是空格的输入字符串流?

时间:2019-01-23 03:31:18

标签: c++ getline sstream

注意:我刚刚了解了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 :(得分:0)

自由功能getline还提供了一个自定义定界符,如user4581301所述。但是,它只会提取string,而您也有int

可以在此答案中找到类似的解决方案,并且我已经修改了代码以满足您的需求:changing the delimiter for 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

当然,您也可以在示例中使用它。

如果仅通过更改rc[Delim] = std::ctype_base::space而通过写类似于第11行(Delim)的行来扩展表,则可以有多个字符将被解释为空格。

我不确定这能解决您最初编写数学解析器的问题。通用术语涉及“解析器”和“词法分析器”概念,您可以研究这些概念以构建可靠的数学求解器。希望它也有帮助。