首页 > 解决方案 > 从文件计算数据作为输入

问题描述

解决了。

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

谢谢你的帮助。

我想逐行读取,然后把它变成一个后缀表达式,最后计算它。所以我写了下面的代码。

  1. 在文本文件中输入以 $ 结尾的表达式。
  2. 并将字符串作为“ fgets ”的函数读取。
  3. 用 ' $ ' 分隔字符串,并清除换行符并将其传递给 convPost 参数。
  4. 输出测试结果。

只要我打印输入字符串并将其更改为后缀表达式就没有关系。

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 +

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

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

标签: c

解决方案


推荐阅读