扫描字符串并在不同的向量C ++中存储数字和操作

时间:2016-07-02 16:24:12

标签: c++

假设我有一个字符串exp,格式如下:

123 + 456 * 789-1011 + 1213

我想将所有数字存储在矢量编号中,并将所有操作存储在矢量操作中。

vector<long long>numbers // {123, 456, 789, 1011, 1213}
vector<char>op // {+, *, -, +}

for (int i = 0; i <  exp.size(); i++){
    if (exp[i]=="+" || exp[i]=="-" || exp[i]=="*"){
        op.push_back(exp[i]);
    }else{
        ...
    }
}

如何存储数字,并将它们从char转换为long long?

2 个答案:

答案 0 :(得分:1)

您需要解析输入表达式以提取数字和运算符 有很多方法可以做到这一点,但以下是我的方法。

  1. 遍历所有字符并按下操作员向量中不是数字的值,并将其替换为空格。

  2. 现在从表达式中提取数字并将其转换为数字,并将值推送到数字向量中。

  3. 要了解如何拆分字符串,您可以查看以下链接:

    1. Split a string - Stack overflow
    2. Split a string - cplusplus.com
    3. 使用stolstrtol或字符串流将string转换为long值。

      #include <iostream>
      #include <string>
      #include <vector>
      #include <sstream>
      
      int main()
      {
          std::string exp = "123+456*789-1011+1213";
          std::vector<long> vecNums;
          std::vector<char> vecOper;
          for (decltype(exp.size()) i = 0; i < exp.size(); ++i) {
              if (!isdigit(exp[i])) {
                  vecOper.push_back(exp[i]);
                  exp[i] = ' ';
              }
          }
          std::istringstream iss(exp);
          while (iss) {
              std::string substr;
              long num;
              std::getline(iss, substr, ' ');
              if (substr.size() != 0) {
                  // Using strtol function
                  // num = strtol(substr.c_str(), NULL, 10);
                  // Using stol function
                  num = stol(substr);
                  vecNums.push_back(num);
              }
              //
              // Or use string stream to convert string to long
              //
              //long num;
              //iss >> num;
              //vecNums.push_back(num);
          }
          std::cout << "Numbers: " << std::endl;
          for (auto &i : vecNums) {
              std::cout << i << " ";
          }
          std::cout << "\nOperators: " << std::endl;
          for (auto &i : vecOper)
              std::cout << i << " ";
          return 0;
      }
      

答案 1 :(得分:0)

如果您要使用iostreams

void parse_string(const string& s) {
    using num_t = long long;
    using op_t = char;
    istringstream sstr(s);
    vector<num_t> numbers;
    vector<op_t> ops;

    (void)sstr.peek();  //set eofbit if s.empty() 
    while (!sstr.eof() && !sstr.fail()) {
        num_t num;
        sstr >> num;
        if (!sstr.fail()) {
            numbers.push_back(num);
            if (!sstr.eof()) {
                op_t op;
                sstr >> op;
                if (!sstr.fail()) {
                    ops.push_back(op);
                }
            }
        }
    }
    //assert(ops.size() + 1 == numbers.size());

    //copy(begin(numbers), end(numbers), ostream_iterator<num_t>(cout, " "));
    //copy(begin(ops), end(ops), ostream_iterator<op_t>(cout, " "));
}

检查代码已被删除时出错(验证运算符是否正确,例外)。