计算文件中的数据作为输入

时间:2018-05-06 16:04:36

标签: c

  

已解决。

我犯了一个可怕的错误。我没有初始化全局变量。

感谢您的帮助。

我想逐行阅读,然后将其转换为后缀表达式,最后计算出来。 所以我写了下面的代码。

  1. 在文本文件中输入以$结尾的表达式。
  2. 并将字符串作为'fgets'的函数读取。
  3. 使用'$'分隔字符串,并清除换行符并将其传递给convPost参数。
  4. 输出测试结果。
  5. 只要我打印输入字符串并将其更改为后缀表达式就没关系。

    char * convPost(char * charArray)
    {
        stack_C * temp = malloc(sizeof(stack_C));
        (*temp).arr = malloc(SIZE * sizeof(char));
        (*temp).top = -1;
        char * postFix = malloc(SIZE * sizeof(char));
        for(int i = 0; i < charArray[i] != '\0'; i++)
        {
            if((isdigit(charArray[i])||(isalpha(charArray[i]))))
            {
                do
                    postFix[arrIndex++] = charArray[i++];
                while(isdigit(charArray[i])||(isalpha(charArray[i])));
                postFix[arrIndex++] = ' ';
                i--;
            }
            else if(charArray[i] == ')')
            {
                while((*temp).arr[(*temp).top] != '(')
                    postFix[arrIndex++] = pop(temp);
                pop(temp);
            }
            else if(checkPrec(temp, charArray[i], (*temp).top))
            {
                while(checkPrec(temp, charArray[i], (*temp).top))
                    postFix[arrIndex++] = pop(temp);
                push(temp, charArray[i]);
            }
            else
                push(temp, charArray[i]);
    
        }
        for(int i = (*temp).top; i >= 0; i--)
            postFix[arrIndex++] = pop(temp);
    
        printPostFix(postFix, arrIndex);
        return postFix;
    }
    
    int evalPostExpr(char * postFix)
    {
        int i, op1, op2;
        stack_C * eval = malloc(sizeof(stack_C));
        eval->arr = malloc(SIZE*sizeof(int));
        eval->top = -1;
        for(i = 0; postFix[i] != '\0'; i++)
        {
            if(isdigit(postFix[i]))
                push(eval,convInt(&postFix[i], &i));
            else if(postFix[i] == ' ')
                i++;
            else
            {
                op2 = pop(eval);
                op1 = pop(eval);
                switch(isOper(&postFix[i]))
                {
                    case plus: push(eval, op1 + op2); break;
                    case minus: push(eval, op1 - op2); break;
                    case multiply: push(eval, op1 * op2); break;
                    case divide: push(eval, op1 / op2); break;
                    case modulus: push(eval, op1 % op2); break;
                }
            }
        }
        return pop(eval);
    }
    
    // main 함수
    int main(void)
    {
        FILE* data;
        char expr[SIZE];
        char * result;
        char str[] = "$";
        char * test;
        if((data = fopen("data.txt", "rt") )== NULL)
        {
            puts("failed to open");
            return -1;
        }
        else
        {
            while(fgets(expr,SIZE, data) != NULL)
            {
            expr[strlen(expr)-1] = '\0';
            printf("The string is %s\n", expr);
            result = strtok(expr, str);
            test = convPost(expr);
    
            printf("%s\n", test);
            }
        }
        return 0;
    }
    

    但是这就是结果。

    The string is 6*(3+2)-9*(3-2)$
    6 3 2 +*9 3 2 -*-
    6 3 2 +*9 3 2 -*-
    The string is 8+3*5/(4-2)%6+9$
    8 3 5 *4 2 -/6 %+9 +
    

    它适用于第一个字符串,但第二个字符串会输出一个空格。

    我不知道为什么会有这样的结果。 我一直在寻找解决方案。我尝试了很多方法,但我无法想出答案。 我做错了什么?为什么????

0 个答案:

没有答案