MISSPELL 런타임 오류 질문드립니다

  • didghgud
    didghgud

    MISPELL
    에서 답안제출시 런타임 문제입니다.

    이러한 사이트를 겪어본지 얼마안되는지라 이러한 오류를 잘 이해하지못하고있어 질문 드립니다.
    제가 사용하고있는 windows7/visual studio 2010에서는 원하는 답이 잘 출력되지만 어떠한 이유에서인지 알고스팟에서는 오류가 뜹니다.

    제가 겪고있는 런타임 오류입니다.

    RTE (SIGSEGV: segmentation fault, probably incorrect memory access)

    제가 제출한 소스 코드는 아래와 같습니다.

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int T,i,j,delete_spell;
        char str[1000][81];
        scanf("%d",&T);
        for(i=0; i<T; i++)
        {
            scanf("%d%s",&delete_spell,str[i]);
            for(j=0; j<strlen(str[T])-delete_spell; j++)
                str[i][delete_spell-1+j] = str[i][delete_spell+j];
            str[i][j] = '\0';
        }
        for(i=0; i<T; i++)
        {
            printf("%d ",i+1);
            printf("%s\n",str[i]);
        }
        return 0;
    }
    

    제 짧은 생각과 인터넷 검색으로는 허락되지않은 메모리 공간에 접근하였다는 말이라는 것 같은데 어느부분에서 메모리 접근을 잘못하였는지 알수가 없네요.

    아직 경험이 부족하여 잘 설명 드리지 못하였지만 어떠한 경우에 발생하는 오류인지 만약 어느부분을 고쳐야할지 알고계시다면 알려주시면 감사하겠습니다.


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

    오타도 하나 있고 틀린 부분도 있으니 한번 찾아보세요


    10년 전 link
  • kriii
    kriii

    이하 스포일러입니다.

    정답을 모아서 출력하는 것 보다 테스트 케이스 하나 단위로 하나씩 출력하시는게 더 편합니다. 정답 판정에 영향을 주지도 않으니까요.

    먼저 strlen(str[T])를 쓰셨는데 T=1000인 경우 런타임에러가 나는것으로 보입니다. 의도하신 바는 strlen(str[i])인것 같네요.
    또한 strlen함수를 for루프에 넣으시면 시간저하가 되므로 다른 변수에 길이를 저장하시는게 좋습니다.

    그리고 이걸 고쳐도 오답이 나오는데 str[i][j] = '\0'; 부분에 문제가 있습니다.

    str[i][delete_spell-1+j] = '\0';
    로 고치시면 정상작동합니다.


    10년 전 link
  • didghgud
    didghgud

    krill님 정말 감사합니다!!
    제 눈은 믿을게 못되나봅니다 ㅜㅜ 더 꼼꼼히 살펴보는 계기가 되겠네요.
    친절하고 상세한 답변 감사드립니다.


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