用数学表达式拆分字符串

时间:2017-02-02 22:01:59

标签: c++ file-io split

在将操作分配给数学运算符后,如何将字符串拆分为两部分?例如4567 * 6789我想将字符串分成三部分 第一名:4567操作:*第二名:6789 输入来自textfile

char operation;
while (getline(ifs, line)){

    stringstream ss(line.c_str());
    char str;

    //get string from stringstream
    //delimiter here + - * / to split string to two part

    while (ss >> str) {
        if (ispunct(str)) {
            operation = str;
        }
    }
}

5 个答案:

答案 0 :(得分:2)

也许,只是也许,通过思考这个问题,我们可以提出一个解决方案。

我们知道operator>>在遇到不是数字的字符时会停止处理。所以我们可以使用这个事实。

int multiplier = 0;
ss >> multiplier;

下一个字符不是数字,因此它们可以是操作符 如果我们读到一个角色会发生什么:

char operation = '?';
ss >> operation;

哦,我忘了提到operator>>默认会跳过空格。

最后,我们可以输入第二个数字:

int multiplicand = 0;
ss >> multiplicand;

要确认,请打印出我们读过的内容:

std::cout << "First Number: " << multiplier << "\n";
std::cout << "Operation   : " << operation << "\n";
std::cout << "Second Number: " << multiplicand << "\n";

在这里使用调试器将有助于显示正在发生的事情,因为每个语句都会被执行,一次是一个。

编辑1:更复杂
您总是可以变得更复杂并使用解析器词法分析器或编写自己的。一种好的实现方法是使用状态机。

例如,您将读取单个字符,然后根据状态决定如何处理它。例如,如果字符是数字,则可能需要构建数字。对于角色(除了空白区域),将其转换为标记并将其存储在某处。

有解析树和其他数据结构可以简化解析操作。还有解析库,例如boost::spirit,yacc,bison,flex和lex。

答案 1 :(得分:0)

一种方法是:

char opr;
int firstNumber, SecondNumber;
ss>>firstNumber>>opr>>SecondNumber;

而不是:

while (ss >> str) {
    if (ispunct(str)) {
        operation = str;
    }
}

或使用regex进行复杂的扩展。 Here是在数学扩展中使用正则表达式的一个示例。

答案 2 :(得分:0)

如果您手边有一个字符串,您可以简单地将字符串左右分割为操作员位置,如下所示:

ImportError: libcudnn.5: cannot open shared object file: No such file or directory

答案 3 :(得分:0)

一个简单的解决方案是使用sscanf

int left, right;
char o;
if (sscanf("4567*6789", "%d%c%d", &left, &o, &right) == 3) {
    // scan valid...
    cout << left << " " << o << " " << right;
}

答案 4 :(得分:0)

我的职责是创造功能:

std::size_t delimiter_pos(const std::string line)
{
   std::size_t found = std::string::npos;
   (found = line.find('+')) != std::string::npos ||
   (found = line.find('-')) != std::string::npos ||
   (found = line.find('*')) != std::string::npos ||
   (found = line.find('/')) != std::string::npos;
   return found;
}

计算操作数的第二个函数:

void parse(const std::string line)
{
   std::string line;
   std::size_t pos = delimiter_pos(line);
   if (pos != std::string::npos)
   {
      std::string first = line.substr(0, pos);
      char operation = line[pos];
      std::string second = line.substr(pos + 1, line.size() - (pos + 1));
   }
}

我希望我的例子帮助你