已解决。
我犯了一个可怕的错误。我没有初始化全局变量。
感谢您的帮助。
我想逐行阅读,然后将其转换为后缀表达式,最后计算出来。 所以我写了下面的代码。
只要我打印输入字符串并将其更改为后缀表达式就没关系。
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 +
它适用于第一个字符串,但第二个字符串会输出一个空格。
我不知道为什么会有这样的结果。 我一直在寻找解决方案。我尝试了很多方法,但我无法想出答案。 我做错了什么?为什么????