繁体   English   中英

从字符串中提取数字和字符,不遵循特定的格式? (后缀计算器)

[英]extracting numbers and characters from a string, which doesn't follow a specific format? (postfix calculator)

我在输入字符串中分隔数字和字符时遇到问题。 我的程序的目的是在后缀中加,减,乘和除,所以我无法预测输入形式,因为它可以是从2 2 3 + *(答案为10)2 2 + 3 *(答案为12)的任何内容 所以我不能使用sscanf来提取数字和操作符,而不需要输入字符串的特定格式。 我该怎么办?

好吧,为了处理postfix,你需要实现一个堆栈,所以你应该在你得到它时将每个数字推到一个堆栈上,每个操作符从堆栈弹出两个并推回结果。

一种方法是使用scanf("%s") ,它将字符返回到下一个空格。 或者您可以使用getc获取一个字符。

编辑:

我从评论中看到你正在使用get来读取整行,在这种情况下,你可能最好在循环中使用strtok将行分解为标记,然后查看每个标记的第一个字符来决定什么与它有关。

char line[MAX_LINE];
// read in the line 

char * pTok = strtok(line, " \t");
while (pTok)
{
    char ch = pTok[0];
    if (isdigit(ch))
       //handle number

    if (ch == '+')
       //handle addition operator

    ...
    pTok = strtok(NULL, " \t");
}

我建议使用Boost.Spirit Qi,这是一个非常好的解析器库。 第一个例子是计算器......

http://www.boost.org/doc/libs/1_42_0/libs/spirit/doc/html/spirit/introduction.html

仅限标准库的解决方案:

// Get a line of user input (simplifies I/O)
std::string line;
if (!std::getline(std::cin, line)) throw std::runtime_error("Unable to read line");
// Process the line as an input string stream
std::istringstream iss(line);
while (true) {
    unsigned int val;
    if (iss >> val) {
        // TODO: Handle a numeric value (in val)
        continue;
    }
    iss.clear(); // Clear the error state
    char ch;
    if (!iss.get(ch)) break; // Break the loop if there is no more input
    // TODO: Handle a character (in ch)
}

我可能通过抓取整行来做到这一点,然后有一个函数接受一个字符串,一个偏移量和一个返回结构。 返回结构包含令牌的开始和结束偏移量,令牌类型(运算符,参数)以及可能的其他一些内容。

或者,将其拆分为两个函数,一个用于检查数字,另一个用于检查操作符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM