c언어 간단 질문

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>

#define MAX 100

typedef char element;
typedef struct { //스택 구조체
	element data[MAX];
	int top;
}StackType;

void init(StackType *s){
	s->top=-1;
}

int Empty(StackType *s){
	return(s->top==-1);
}

int Full(StackType *s){
	return (s->top== MAX-1);
}

void push(StackType *s, element data){
	if(Full(s)){
		fprintf(stderr, "포화상태\n");
		return;}
	else
		s->data[++(s->top)]=data;
}

element pop(StackType *s){
	if(Empty(s)){
		fprintf(stderr, "공백상태\n");
		exit(1);
	}
	else
		return s->data[(s->top)--];
}

element peek(StackType *s){
	if(Empty(s)){
		fprintf(stderr, "공백상태\n");
		exit(1);
	}
	else
		return s->data[s->top];
}

int first(char op){
	switch(op){
	case '(': case ')': return 0;
	case'+': case'-': return 1;
	case'*': case'/': return 2;
	case'^': return 3;
	}
	return -1;
}

char* postfix(char eq[],StackType *s){
	int i,j=0;
	char ch, top_op;
	int len= strlen(eq);
	char* postFix= (char*) malloc(sizeof(char) *len);
	
	init(s);

	for( i=0; i<len; i++){
		ch=eq[i];
		switch(ch){
		case'+':case'-':case'*':case'/':case'^': 
			while(!Empty&& (first(ch)<=first(peek(s))))
				postFix[j++]=pop(s);

			push(s,ch);
			break;

		case'(': push(s,ch);
			break;
		case')':
			top_op=pop(s);
			while(top_op!='('){
				postFix[j]=top_op;
				j++;
				top_op=pop(s);
			}
			break;

		default:
			postFix[j]=ch;
			j++;
			break;
		}
	}
	while(!Empty(s))
		postFix[j++]=pop(s);
	return postFix;
}

int eval(char exp[],StackType *s){
	int op1, op2, value, i=0;
	int len= strlen(exp);
	char ch;

	init(s);

	for(i=0; i<len; i++){
		ch= exp[i];
		if(ch !='+' &&ch !='-' &&ch !='*' &&ch !='/' &&ch !='^'){
			value= ch-'0';
			push(s,value);
		}
		else{
			op2= pop(s);
			op1= pop(s);
			switch(ch){
			case'+': push(s, op1+op2); break;
			case'-': push(s, op1-op2); break;
			case'*': push(s, op1*op2); break;
			case'/': push(s, op1/op2); break;
			case'^': push(s, pow((double)op1,op2)); break;
			}
		}
	}

	return pop(s);
}

int main(){
	StackType s;
	int result;
	char* spostfix;
	char infix[MAX];
	init(&s);
	printf("수식을 입력하세요: ");
	scanf("%s", infix);

	spostfix= postfix(infix, &s);
	result= eval(spostfix, &s);

	printf("결과값은 %d\n", result);
//	free(spostfix);

	return 0;
}

간단한 후위계산식 계산 프로그램을 만드는데, ctrl+F5키를 눌러서 실행시키고 식을 입력하고 엔터를 치면 그냥 바로 프로그램이 강제종료됩니다… 왜그러는지 도와주세요ㅜㅜ 프로그램의 문제인가요??

안녕하세요.

컴퓨터는 구약성서의 신과 같아서 규칙은 많고 자비는 없기로 유명하죠~
아마 코드에 오류가 있는거처럼 보이네용

postfix함수의 반환값이 null로 끝나는 적절한 문자열이 아닌거같아요.
그래서 eval함수 넘겼을때 길이계산이 오류가 나는것 같네요.

char* postfix(char eq[], StackType* s) {
	int i, j = 0;
	char ch, top_op;
	int len = strlen(eq);
	char* postFix = (char*)malloc((len + 1));

        .........

	while (!Empty(s))
		postFix[j++] = pop(s);
	postFix[j] = NULL;
	return postFix;
}
2 Likes

저 문장을 없애도 계속 똑같이 오류가 납니당…ㅠㅜㅠㅜ

아뇨 뭘 없애요

postFix[j] = NULL;
이거 추가하라구요.

코드는 안 봤지만 강제종료가 된다니 프로그램의 문제겠네요

1 Like

아 추가해도 오류가 납니다 ㅎ…
댓글 달아주셔서 감사합니다!!!:slight_smile:

그런건가요…ㅠㅠ 전에 잘 되던게 왜 문제가 났을까요 아무튼 감사합니다ㅜ

어떤 오류가 나나요?

뭘 입력했는데 에러가나요?

제가 간단히 입력해봤을때는 오류가 없었거든요.

image

============================================================

저거 안넣으면 아래처럼 실행되요.

image

저거 넣으면 고쳐집니다.

프로그램 종료 시 멈추게 안해놔서 그런걸지도…

개인적으로 NULL보다는 '\0’이 의도를 더 잘 드러내는 표현인 것 같읍니다. C 특성상 작동은 똑같지만요 ㅎ

맞습니다 그렇게 표현하는게 더 좋죠