c - 从文件计算数据作为输入
问题描述
解决了。
我犯了一个可怕的错误。我没有初始化全局变量。
谢谢你的帮助。
我想逐行读取,然后把它变成一个后缀表达式,最后计算它。所以我写了下面的代码。
- 在文本文件中输入以 $ 结尾的表达式。
- 并将字符串作为“ fgets ”的函数读取。
- 用 ' $ ' 分隔字符串,并清除换行符并将其传递给 convPost 参数。
- 输出测试结果。
只要我打印输入字符串并将其更改为后缀表达式就没有关系。
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 +
它适用于第一个字符串,但第二个字符串输出一个空格。
我不知道为什么会出现这样的结果。几天来我一直在寻找解决方案。我尝试了很多方法,但我无法找到答案。我做错了什么?为什么????
解决方案
推荐阅读
- ruby-on-rails - Active Storage 图像未保存到本地数据库
- python - 在 python 上使用 pdftotext 时创建文档时出现 Poppler 错误
- bash - 将 mogrify 与 Image Magick 一起使用时如何重命名图像?
- html - 如何删除网格布局底部的空白区域
- google-cloud-platform - How to create a new table with nested data in big query from another tables?
- javascript - Building a deeply nested boolean object with JavaScript
- json - No value associated with key CodingKeys with Unsplash API
- clang++ - "#include
" or not makes a performance difference on clang++ - html - i18next/i18n Change Language not working with the whole website
- php - WordPress 安全 - 子主题后门