入力ファイルは、正と負の浮動小数点値と、加算 (+)、減算 (-)、乗算 (*)、除算 (/) をサポートする単一の代数式を後置順に指定する必要があります。すべての浮動小数点値と演算は、空白で区切る必要があります。次の行をスキャンする必要があります。
4 5 + 20 3 - * -4.0 +
atof 関数を使用して引数をスキャンするために使用した文字列を float に変換し、それをリンクされたリスト要素に入れようとすると、エラーが発生します。スタック構造も使用しています。ここに私のコードがあります: ListElmt.h
#include "bool.h"
#ifndef LISTELMT_H
#define LISTELMT_H
typedef struct ListElmt_ {
float num;
struct ListElmt_ *next;
} ListElmt;
#endif
main.c
#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;
}
私はビジュアルスタジオを使用しているので、エラーなどは表示されませんが、壊れてatofで奇妙なファイルに移動します。