<c언어> 비주얼 스튜디오에서는 실행되는데 gcc는 계속 반복이 돕니다

코리올리효과의 이미지

중위표기식을 후위표기식으로 바꾸는 함수인데 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';
}
라스코니의 이미지

for (i; 를 for (i=0; 등으로 수정한 뒤에 같은 증상이 나타나는지 보세요.

ymir의 이미지

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 』

chanik의 이미지

무한반복 발생위치가 외부루프인지 내부의 특정루프인지부터 확인하고
그 지점에서 관련변수들을 찍어보면 답 나오겠네요.

gdb로 중단점 몇 군데 만들어서 하셔도 되고
그냥 여기저기에 printf() 끼워서 하셔도 되겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.