XHAENEUNG 질문입니다.

  • 2000spot
    2000spot

    const int max_num = 11;
    char * word[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};

    // 원래 연산의 참된 결과값을 얻는다.
    int solve_result(char * ptr1, char * ptr2, char * op) {
    int n1=-1, n2=-1;

    for(int i=0 ; i<max_num ; i++) {
        if(strcmp(ptr1, word[i])==0) {
            n1 = i;
        }
        if(strcmp(ptr2, word[i])==0) {
            n2 = i;
        }
    }
    
    if(n1 == -1 || n2 == -1) 
        return -1;
    
    switch(*op) {
    case '+': return n1 + n2;
    case '-': return n1 - n2;
    case '*': return n1 * n2;
    }
    
    return -1;

    }

    //qsort를 이용하기 위한 포인터 함수
    int compare(const void * a, const void * b) {
    return (strcmp((char*)a, (char*)b));
    }

    //정답의 단어들은 순서가 바뀌어도 되기 때문에 qsort를 하여 strcmp 하여 정확히 일치하면 정답으로 인정
    int correct_result(char * ptr, int result) {
    char str[6];
    char pstr[11];

    strcpy(pstr, ptr);
    strcpy(str, word[result]);
    qsort((void *)pstr, strlen(pstr), sizeof(char), compare);
    qsort((void *)str, strlen(str), sizeof(char), compare);
    
    if(strcmp(pstr, str) == 0)
        return 1;
    else 
        return 0;

    }

    int main()
    {
    unsigned int n;
    char str[35];
    char *ptr, *ptr1, *ptr2, *ptr3, *op;
    int result;

    scanf("%d", &n);
    fflush(stdin);
    
    while(n!=0) {
        n--;
    
        fgets(str, sizeof(str), stdin);
        str[strlen(str) - 1] = '\0';
        //gets(str);
    
        //첫번째 피연산자
        ptr1 = strtok(str, " ");
    
        //연산자
        op = strtok(NULL, " ");
    
        //두번째 피연산자
        ptr2 = strtok(NULL, " ");
    
        // = 토큰을 받고 연산의 결과값을 받는다.
        strtok(NULL, " ");
        ptr3 = strtok(NULL, " ");
    
        // 실제 결과값을 구한다.
        result = solve_result(ptr1, ptr2, op);
    
        // 결과값의 범위가 올바르지 않으면 No 출력
        if(result < 0 || result > 10) {
            printf("No\n");
        }
        else {
            //실제 결과값이랑 ptr3를 비교하여 올바르면 Yes, 올바르지 않으면 No 출력
            if(correct_result(ptr3, result)==1) {
                printf("Yes\n");
            }
            else {
                printf("No\n");
            }
        }
    }
    
    return 0;

    }

    런타임 오류가 뜨는데 런타임 오류가 뜨는 이유는 어떤 경우인가요??


    8년 전
2개의 댓글이 있습니다.
  • JongMan
    JongMan

    프로그램이 비정상적인 동작을 했을 때입니다. 배열 범위를 벗어나는 값에 접근하는 것이 대표적 경우죠. fflush(stdin) 또한 하시면 안됩니다. https://algospot.com/forum/read/1479/#c7082 를 참고하세요.


    8년 전 link
  • 2000spot
    2000spot

    아 감사합니다. fflush 가 문제였군요 ㅎㅎ 이제 풀었습니다.


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.