0

输入文件应以后缀顺序指定单个代数表达式,支持正负浮点值和以下运算:加法 (+)、减法 (-)、乘法 (*)、除法 (/)。所有浮点值和操作都应该用空格分隔。我必须在以下行中扫描:

4 5 + 20 3 - * -4.0 +

尝试使用 atof 函数将用于扫描参数的字符串转换为浮点数并将其放入链表元素时出现错误。我也在使用堆栈结构。这是我的代码:ListElmt.h

#include "bool.h"



#ifndef LISTELMT_H
#define LISTELMT_H



typedef struct ListElmt_ {
   float num;
   struct ListElmt_ *next;
} ListElmt;


#endif

主程序

#include "bool.h"
#include "listelmt.h"
#include "list.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>



#define BUFSIZE 1000

int stack_push(List *list, int data){

    return list_ins_next(list, NULL, data);
}

int stack_pop(List *list, ListElmt *data){
    if(list->top->num == data->num){
        return list_rem_next(list, data);
    }
}

int main ( int argc, char *argv[] )
{
   FILE *ifp;
    char fileInput[BUFSIZE];
   char *newStr;
   List *argument_list;
   ListElmt *stack_elmt;
   int i = 0;
  float a=0; float b = 0; int c = 0;

 if ( argc != 2 ) /* argc should be 2 for correct execution */
{
    /* We print argv[0] assuming it is the program name */
    printf( "usage: %s filename", argv[0] );
}
else 
{
    // We assume argv[1] is a filename to open
    ifp = fopen( argv[1], "r" );

    if (ifp == 0 ){

        printf("Could not open file\n");
    }

    else{
            argument_list = (List *)malloc(sizeof(List));

           list_init(argument_list);
           stack_elmt = (ListElmt*)malloc(sizeof(ListElmt));



        while (fscanf(ifp, "%s", &newStr) != EOF){

             if(newStr != "+" || newStr != "-"|| newStr != "*"|| newStr!= "/" ){

                 stack_elmt->num = atof(newStr);

                 stack_elmt->next = NULL;

                 stack_push(argument_list, stack_elmt->num);
             }

             else{
                 if(newStr == "+"){
                     a = argument_list->top->num;
                     stack_pop(argument_list, argument_list->top);
                     b = argument_list->top->num;
                     stack_pop(argument_list, argument_list->top);
                     stack_elmt->num = a+b;
                     stack_elmt->next=NULL;

                     stack_push(argument_list, stack_elmt->num);
                 }
                 else if(newStr == "-"){
                     a = argument_list->top->num;
                     stack_pop(argument_list, argument_list->top);
                     b = argument_list->top->num;
                     stack_pop(argument_list, argument_list->top);
                     stack_elmt->num = a-b;
                     stack_elmt->next=NULL;

                     stack_push(argument_list, stack_elmt->num);
                 }
                 else if(newStr == "*"){
                     a = argument_list->top->num;
                     stack_pop(argument_list, argument_list->top);
                     b = argument_list->top->num;
                     stack_pop(argument_list, argument_list->top);
                     stack_elmt->num = a*b;
                     stack_elmt->next=NULL;

                     stack_push(argument_list, stack_elmt->num);
                 }
                 else if(newStr == "/"){
                     a = argument_list->top->num;
                     stack_pop(argument_list, argument_list->top);
                     b = argument_list->top->num;
                     stack_pop(argument_list, argument_list->top);
                     stack_elmt->num = a/b;
                     stack_elmt->next=NULL;

                     stack_push(argument_list, stack_elmt->num);
                 }
             }

             printf("%lf", argument_list->top->num);





        }
    }
 }//list_destroy(argument_list);
   getchar();
   //return 0;
     }

我正在使用 Visual Studio,所以它不会告诉我有错误或任何东西,而是会中断并使用 atof 转到一些奇怪的文件。

4

1 回答 1

2
  • 对于字符串比较,使用strcmp()or strncmp()

    if(newStr != "+" || newStr != "-"|| newStr != "*"|| newStr!= "/")不会按预期比较字符串。

  • 只声明了指针。

    字符 *newStr;

    所以内存应该动态分配或静态分配。即char newStr[MAX_STR_LEN];malloc(MAX_STR_LEN);MAX_STR_LEN 是预期的最大字符串长度。

于 2012-11-20T06:36:09.857 回答