【发布时间】:2019-09-14 23:44:10
【问题描述】:
这里是代码(抱歉,如果有废话格式,试图从控制台复制是愚蠢的(vim)):
#include <stdio.h>
void printhelp(){
printf("\nhelp\n"); /* TODO make this more accurate */
}
int numstack[32];
char numpointer = 0;
char pushNum(int in){
if(numpointer < 31)
numstack[numpointer++] = in;
else return 1;
return 0;
}
int popNum(){
printf("%i", numstack[numpointer]);
if(numpointer)
return numstack[numpointer--];
else return -1;
}
void handleOp(char op){
switch(op){
case '+':
pushNum(popNum + popNum);
break;
case '-':
pushNum(popNum - popNum);
break;
case '*':
pushNum(popNum * popNum);
break;
case '/':
pushNum(popNum / popNum);
break;
}
}
/* MAIN */
int main(int argc, char *argv[]){
switch(argc){
case 1:
printhelp();
return 0;
case 2:
if(argv[1][0] == '-'){
if(argv[1][1] == 'h')
printhelp();
return 0;
}
}
int args = 1;
int argtot = argc;
int num;
while(args <= argtot){
num = atoi(argv[args]);
if(num > 48)
pushNum(atoi(argv[args]));
handleOp(argv[args++][0]);
}
printf("total: %i", popNum());
return 0;
}
我收到了一些关于类型转换的警告,主要是在指针和 int 之间。我现在已经修复了所有这些,但最终的 printf 现在没有输出任何东西,当它完成时它给我的只是零,我的 numstack 似乎充满了垃圾,但我不明白为什么;即使明确地将其初始化为 32 0s 也不会改变这一点。最终目标是:
输入
计算 2 3 + 4 *
输出
20
输入可以是任意长度reverse polish notation数学表达式,它会解决它。现在我只关心 + - * / 但最终想添加幂模数等,以及一些练习集。我也意识到我的一些变量的大小写不一致,可能还有其他一些坏习惯,我正在努力解决这些问题
(如果有帮助,我会在 win10 上使用 tcc)
【问题讨论】:
-
pushNum(popNum + popNum);是错误的。popNum是一个函数,在这个表达式中变成了指向函数的指针,不能添加指向函数的指针。您希望在此处调用popNum返回的值是popNum()。编译器几乎肯定会给你一个错误信息。 -
包含
<stdlib.h>以声明atoi。 -
num = atoi(argv[args]);和if(num > 48)。重新考虑你在那里做什么。你如何测试一个字符串是否只包含数字字符?什么是数字字符?为什么要使用48而不是'0'? -
@EricPostpischil 我完全错过了谢谢!我原以为 tcc 会说些什么,但令人惊讶的是根本没有。它抱怨围绕调用handleOp的指针转换,但从来没有。我看看我能不能把它带给开发者
-
handleOp(argv[args++][0]);在输入数字后立即出现。但是你怎么知道一个数字后面的参数是一个运算符呢?在您给出的示例中,它不是:在“2 3 + 4 *”中,“2”之后的参数是数字,而不是运算符。
标签: c calculator postfix-notation