<c언어> 비주얼 스튜디오에서는 실행되는데 gcc는 계속 반복이 돕니다
글쓴이: 코리올리효과 / 작성시간: 수, 2021/06/16 - 5:39오후
중위표기식을 후위표기식으로 바꾸는 함수인데 gcc에서는 if (expr[i] >= '0' && expr[i] <= '9')
이런 비교가 안되는 건지 계속 무한반복이 돕니다
expr은 문자열 형태로 공백이 없이 수식이 저장되어있으며 계속 첫번째 while문에 들어간 다음 if문 조건식이 성립이 안되는지 gcc에서만 무한 반복이 도네요.
혹시 gcc에서는 if (expr[i] >= '0' && expr[i] <= '9') 이런형태의 문자열 비교 말고 무조건 strcmp함수를 사용해야 하는지 궁금합니다
void infix_to_postfix(char expr[], char postfix[]) { int i = 0, j = 0; // i 는 중위표기수식의 index변수 // j 는 후기표기수식의 index변수 init_stack(); while (expr[i] != '\0') { //expr[i]의 값이 숫자일 경우 숫자 또는 '.'이 아닌 다른 값을 만날때까지 postfix에 넣음 if (expr[i] >= '0' && expr[i] <= '9') { for (i; (expr[i] >= '0' && expr[i] <= '9') || expr[i] == '.'; i++) { postfix[j++] = expr[i]; } postfix[j++] = ' '; //postfix배열에 값이 저장된 후 한칸을 비워 앞과 뒤의 값을 구분 //이하 모든 postfix[j++] = ' '; 동일 } //expr[i]의 값이 '(', '{' 또는 '[' 일 경우 스택에 push else if (expr[i] == '(' || expr[i] == '{' || expr[i] == '[') { push(expr[i]); i++; } //expr[i]의 값이 ')' 일 경우 '(' 가 나올때까지 스택내부의 연산자들을 pop해서 postfix에 넣음 // '{' 와 '[' 이하동일 else if (expr[i] == ')') { while (peek() != '(') { postfix[j++] = (char)pop(); postfix[j++] = ' '; } pop(); //남아있는 '(' 제거 i++; } else if (expr[i] == '}') { while (peek() != '{') { postfix[j++] = (char)pop(); postfix[j++] = ' '; } pop(); i++; } else if (expr[i] == ']') { while (peek() != '[') { postfix[j++] = (char)pop(); postfix[j++] = ' '; } pop(); i++; } //expr[i]의 값이 연산자일 경우 스택의 peek()(스택의 최상위 항목)과 비교 //peek()이 expr[i]보다 우선순위가 높거나 같을 경우 그렇지 않을 때까지 pop해서 postfix에 넣음 else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/' || expr[i] == '^') { while (!is_empty()) { if (precedence((char)peek()) >= precedence(expr[i])) { postfix[j++] = (char)pop(); postfix[j++] = ' '; } else break; } //우선순위가 높거나 같은 연산자가 없거나 while문을 통해 다 pop되었으면 expr[i]를 push push(expr[i]); i++; } } //스택에 남은 연산자들을 꺼내서 postfix에 넣음 while (!is_empty()) { postfix[j++] = (char)pop(); postfix[j++] = ' '; } //postfix 배열의 끝을 널문자를 넣어 표시 j--; postfix[j] = '\0'; }
Forums:
for (i; 를 for (i=0; 등으로 수정한
for (i; 를 for (i=0; 등으로 수정한 뒤에 같은 증상이 나타나는지 보세요.
음 ..
while loop 탈출 조건은 2개 밖에 없는데..
먼저 expr[] 에 값이 제대로 들어 있는지 확인이 필요할 것 같네요.
expr[] 에 if 조건에 해당하는 값이 없는 경우, i 가 증가하지 않기 때문에 무한 loop 돌 테고..
expr[] 이 '\0' 으로 끝나지 않으면, 최대한 도는 데까지 돌다가 죽을 겁니다.
예전 기억으로 VS 에서 디버그 모드로 빌드하면, array 같은거 알아서 0 으로 초기화 해주기 때문에..
문자열 같은거 제대로 terminate 안 시켜줘도 문제가 있는지 모르고 있다가..
릴리즈 모드로 빌드 하거나 다른 컴파일러에서 돌렸다가 문제를 발견했던 기억이 있는데..
어쨌든 함수가 호출되면, expr 부터 찍어 봐서 제대로 값이 들어 있는지 먼저 확인해 보세요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
무한반복 발생위치가 외부루프인지 내부의
무한반복 발생위치가 외부루프인지 내부의 특정루프인지부터 확인하고
그 지점에서 관련변수들을 찍어보면 답 나오겠네요.
gdb로 중단점 몇 군데 만들어서 하셔도 되고
그냥 여기저기에 printf() 끼워서 하셔도 되겠습니다.
댓글 달기