atof()指定0,其中需要为double

时间:2014-05-23 07:18:06

标签: c atof

我试图通过命令行提供表达式来编写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有一些东西,但我不知道现在要去哪里。

1 个答案:

答案 0 :(得分:4)

问题就在这里:

printf("Number is: %d\n", values[i].number);

values.number的类型为double(64位),但您将其打印为int(32位),它会调用未定义的行为。