【发布时间】:2016-01-22 22:06:34
【问题描述】:
我正在尝试在 C 中创建一个计算器。我确信我的 eval 函数中的 (char* String) 参数是正确的,但我真的不明白为什么或如何正确使用它。我的 eval 函数将以后缀表示法输入数学表达式。所以这是我到目前为止的代码,基本上我正在尝试接收一个字符串,将所有数字推入一个字符串堆栈,然后如果找到一个运算符,则从字符串堆栈中弹出两个“字符串”,将这些字符串转换为整数(这是我不确定该怎么做的另一件事),进行计算,将结果推送到 int 堆栈上。搜索完所有输入后,循环遍历 int 堆栈并添加所有 int。这是我的代码:(忽略包含)/*
int eval(char* String); //implicit declarations
int bourneLongPush(int);
char* bournePop(void);
int bournePush(char *string);
int bourneLongPop(void);
int bourneGetLongStackSize(void);
int eval(char* String)
{
int result = 0;
int index = 0;
int arg1;
int arg2;
char* endptr;
while(String[index] != '\0'){ //while our String pointer is not equal to null,
if(strtoimax(String, &endptr, 10) == NULL){ //if the character isn't a number,
switch(String[index]){ //switch on the operator
case "+":
arg2 = bournePop();
arg1 = bournePop();//*** how do I change char*'s to ints?
bourneLongPush(arg2+arg1);
break;
case "-":
arg2 = bournePop();
arg1 = bournePop();
bourneLongPush(arg2-arg1);
break;
case "/":
arg2 = bournePop();
arg1 = bournePop();
bourneLongPush(arg2/arg1);
break;
case "*":
arg2 = bournePop();
arg1 = bournePop();
bourneLongPush(arg2*arg1);
break;
case ">":
arg2 = bournePop();
arg1 = bournePop();
bourneLongPush(arg2>>arg1);
break;
case "<":
arg2 = bournePop();
arg1 = bournePop();
bourneLongPush(arg2<<arg1);
break;
case "^":
arg2 = bournePop();
arg1 = bournePop();
bourneLongPush(pow(arg2, arg1));
break;
case "|":
arg2 = bournePop();
arg1 = bournePop();
bourneLongPush(arg2|arg1);
break;
case "&":
arg2 = bournePop();
arg1 = bournePop();
bourneLongPush(arg2&arg1);
break;
case "%":
arg2 = bournePop();
arg1 = bournePop();
bourneLongPush(arg2%arg1);
break;
default:
break;
}
else{ //a number was found
int check = bournePush(String[index]);//push the number into string stack
if(check == 1)
{
//error in push due to size
}
}
index++;
}
}
//Our input was read in as null so no more input needs to be read
for(int j = 0; j<(int)bourneGetLongStackSize; j++)
{
int num = bourneLongPop();
result += num;
}
return result;
}
【问题讨论】:
-
你不能把
arg2 = bournePop(); arg1 = bournePop();移到switch语句之前吗?
标签: c stack calculator