XHAENEUNG 문제 질문있습니다.

  • Jinsanger
    Jinsanger

    현재 예제 데이터는 물론 댓글에서 제시해주신 데이터들도 테스트해봣는데 Runtime Error가 나오네요..... T_T
    오답도 아니고 Runtime Error라서 감이 안오네요......
    Runtime Error라면 코드가 불안정하다느ㄴ 얘기인데 T_T 어디가 어떻게 불안정한지 모르겟습니다... 고수님들 도와주세요. T_T

    #include <iostream>
    #include <string.h>
    #include <string>
    using namespace std;
    
    int OCR(char* numA){
        int numberA=0;
        if(strcmp(numA, "zero")==0)
            numberA=0;
        else if(strcmp(numA, "one")==0)
            numberA=1;
        else if(strcmp(numA, "two")==0)
            numberA=2;
        else if(strcmp(numA, "three")==0)
            numberA=3;
        else if(strcmp(numA, "four")==0)
            numberA=4;
        else if(strcmp(numA, "five")==0)
            numberA=5;
        else if(strcmp(numA, "six")==0)
            numberA=6;
        else if(strcmp(numA, "seven")==0)
            numberA=7;
        else if(strcmp(numA, "eight")==0)
            numberA=8;
        else if(strcmp(numA, "nine")==0)
            numberA=9;
        else if(strcmp(numA, "ten")==0)
            numberA=10;
        return numberA;
    }
    char* OIR(int number){
        switch(number){
        case 0:     return "zero";
        case 1:     return "one";
        case 2:     return "two";
        case 3:     return "three";
        case 4:     return "four";
        case 5:     return "five";
        case 6:     return "six";
        case 7:     return "seven";
        case 8:     return "eight";
        case 9:     return "nine";
        case 10:    return "ten";
        default:    break;
        }
        return 0;
    }
    bool OCR2(int num, char* target){
        char* answerStr = OIR(num);
        int closeList[10] = {0, };
        int correctCnt = 0;
        if(answerStr == 0){
            return false;
        }
        for(int i=0; i<strlen(answerStr); i++){
            for(int j=0; j<strlen(target); j++){
                if(answerStr[i] == target[j] && closeList[j] != 1){
                    closeList[j] = 1;
                    correctCnt++;
                    break;
                }
            }
        }
        if(correctCnt == strlen(answerStr))
            return true;
        return false;
    }
    int main(void){
        int T = 0, caseCnt = 0;
        int* resultSet = 0;
        cin>>T;
        resultSet = new int[T];
        while(caseCnt < T){
            char numA[6] = {0, };
            char numB[6] = {0, };
            char oper[2] = {0, };
            char equ[2] = {0, };
            char answer[6] = {0, };
            int numberA = 0, numberB = 0, numAnswer = 0;
    
            cin>>numA>>oper>>numB>>equ>>answer;
    
            numberA = OCR(numA);
            numberB = OCR(numB);
            if(strcmp(oper, "+")==0){
                numAnswer = numberA + numberB;
            }
            else if(strcmp(oper, "-")==0){
                numAnswer = numberA - numberB;
            }
            else if(strcmp(oper, "*")==0){
                numAnswer = numberA * numberB;
            }
            else{
                resultSet[caseCnt] = 0;
                caseCnt++;
                continue;
            }
            if(OCR2(numAnswer, answer)){
                resultSet[caseCnt] = 1;
            }else{
                resultSet[caseCnt] = 0;
            }
            caseCnt++;
        }
        for(int i=0; i<caseCnt; i++){
            if(resultSet[i] == 1)
                cout<<"Yes"<<endl;
            else if(resultSet[i] == 0)
                cout<<"No"<<endl;
        }
        return 0;
    }
    

    10년 전
3개의 댓글이 있습니다.
  • sjc1117
    sjc1117

    님께서도 저랑 같은 실수를 하셨네요 OIR이란 함수에서 char*를 반환하시는데 C에서 포인터를 반환하면 안됩니다
    char*를 인자로 받으셔서 처리하셔야 될 것 같습니다


    10년 전 link
  • Jinsanger
    Jinsanger

    감사합니다 ㅋㅋ 해결했습니다. 메모리 불안정 요소를 제거한 이후에도 런타임 에러가 떠서 왜인지 보니까 정답의 제약 사항을 예외 처리를 안했더군요 ㅋㅋ


    10년 전 link
  • Being
    Being
    1. C에서 char *를 반환하는 건 아무런 문제가 없습니다. sjc1117님의 경우 함수 스코프 내에 위치한 지역 변수, 즉 리턴되면 소멸되는 대상에 대한 포인터를 취하셨었기에 문제가 됩니다.
    2. 내부에서 문자열 상수(string literal)을 리턴했는데, 이 경우 원칙적으로는 const char * 타입을 쓰셔야 맞습니다.
    3. 따라서 아마도 위의 코드에서는 해당 문자열을 수정한 적이 없기 때문에 해당 내용은 정답 여부에 아무런 상관이 없었을 것 같네요.

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