我在输入字符串中分隔数字和字符时遇到问题。我的程序的目的是在后缀中进行加,减,乘和除 所以我无法预测输入表格,因为它可以是任何东西 2 2 3 + *(答案为10)至 2 2 + 3 *(答案为12)。所以我不能使用sscanf来提取数字和操作符,而不需要输入字符串的特定格式。我该怎么办?
答案 0 :(得分:2)
好吧,为了处理postfix你需要实现一个堆栈,所以你应该把每个数字推到堆栈上,每个操作符从堆栈中弹出两个并推回结果。
答案 1 :(得分:2)
一种方法是使用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");
}
答案 2 :(得分:0)
我建议使用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)
}
答案 3 :(得分:0)
我可能通过抓取整行来完成此操作,然后使用函数获取字符串,偏移量和返回结构。返回结构包含令牌的开始和结束偏移量,令牌类型(运算符,参数)以及可能的其他一些东西。
或者,将其拆分为两个函数,一个用于检查数字,另一个用于检查操作符。