我试图通过命令行提供表达式来编写rpn clalculator的学校作业。前./calc 2 + 5 \* sin 78
我的想法是使用struct
数据类型来保留数值或运算符类型。
以下是澄清所有内容的主要内容:
#include <stdlib.h>
#include <math.h>
#include <string.h>
enum OPERATORS {val, PLUS, MINUS, MULTI, DIV, SIN, COS};
typedef struct value {
double number;
enum OPERATORS oper;
};
void get_the_onp(char *expression[], int length);
int main(int argc, char* argv[]) {
double result;
int i;
printf("Number of arguments: %d\n", argc);
get_the_onp(argv, argc);
//result = equation(argv, argc);
//printf("Result is: %f", result);
return 0;
}
当我运行get_the_onp()
函数时,atof()
并不像我怀疑的那样工作。这是get_the_onp()
:
void get_the_onp(char* expression[], int length) {
int i, j, k; //iterators i for expression; j for numbers; k for operators
char *current;
struct value values[length];
for (i=1; i<length; i++) {
current = expression[i];
//printf("%f\n", atof(expression[i]));
if (atof(current) != 0 && current != '0') {
//printf("Inside if: %f\n", atof(current));
values[i-1].number = (double) atof(current);
values[i-1].oper = val;
}
else{
switch(current[0]){
case '+':
//values[i].number = NULL;
values[i-1].oper = PLUS;
break;
case '-':
//values[i].number = NULL;
values[i-1].oper = MINUS;
break;
case '*':
//values[i].number = NULL;
values[i-1].oper = MULTI;
break;
case '/':
//values[i].number = NULL;
values[i-1].oper = DIV;
break;
case 's':
//values[i].number = NULL;
values[i-1].oper = SIN;
break;
case 'c':
//values[i].number = NULL;
values[i-1].oper = COS;
break;
}
}
}
//tester
for (i=0; i<length; i++) {
//if (values[i].oper != val)
printf("Operator: %d\n", values[i].oper);
printf("Number is: %d\n", values[i].number);
}
return;
}
示例表达式的输出为:
Number of arguments: 7
Operator: 0
Number is: 2147483636
Operator: 1
Number is: 2147483636
Operator: 0
Number is: 2147483636
Operator: 3
Number is: 2147483636
Operator: 5
Number is: 2147483636
Operator: 0
Number is: 2147483636
Operator: -2072959800
Number is: 2147483626
我想指针current
有一些东西,但我不知道现在要去哪里。
答案 0 :(得分:4)
问题就在这里:
printf("Number is: %d\n", values[i].number);
values.number
的类型为double
(64位),但您将其打印为int
(32位),它会调用未定义的行为。