URI %2525되고, 들어오는 문자개수도 확인했습니다. 고수님들 도와주세요!!

  • penguin
    penguin

    URI
    URI문제

    저는 %문자를 만나면 임시로 2자리 int형 배열에 숫자를 집어넣고
    16진수로 변경한 값을 char형 변수 escape에 저장하여 이를 문자로 찍어내는
    방식으로 URI decoding을 구현했습니다.

    제가 시험해본 예제는 다음과 같습니다.

    예제 결과
    %2a -
    %2525 %25
    %25%25 %%
    %2528 %28
    %20
    %21 !
    %24 $
    %28 (
    %29 )

    담안 검증을 위해서는 t1파일에 저장후,
    URI < t1로 실행하였습니다.

    80자리 문자열에 대비하여 한 줄에 크기 81자가 들어올수 있도록 하였습니다.

    코드는 다음과 같습니다. 언어는 c이구요 우분투 14.04LTS 입니다

    #include<stdio.h>
    #include<stdlib.h>
    int main(void){
        int max_strs = 0;
    
        while((max_strs < 1) || (max_strs > 100)){
            scanf("%d[\n]", &max_strs);
        }
    
        max_strs *= 81;
    
        char *strs = (char*)malloc(sizeof(char)*max_strs);
    
        int i, j;
        for(i = 0; i < max_strs; i += 81){
            scanf("%s[\n]", strs+i);
        }
    
        for(i = 0; i < max_strs; i += 81){
            for(j = 0; j < 81; ++j){
                if(strs[i+j] == '\0')   //80자 미만의 경우를 고려하라는
                    break;              //조 언 을 보고 추가하였지만, 여전히
                if(strs[i+j] == '%'){   //오답 으로 처리됩니다 
                    int k = 0, tmp[2];
                    char escape = 0;
    
                    for(; k < 2; ++k)
                        if( strs[i+j+k+1] < 58 )//9다음
                            tmp[k] = strs[i+j+k+1] - '0';
    
                        else if( strs[i+j+k+1] < 71 )//E
                            tmp[k] = strs[i+j+k+1] - 55;
    
                        else if( strs[i+j+k+1] < 103 )//e
                            tmp[k] = strs[i+j+k+1] - 87;
    
                        else
                            break;
    
                    escape += tmp[1] + tmp[0]*16;
                    printf("%c", escape);
                    j+=2;
                }
                else
                    printf("%c", strs[i+j]);
            }
            printf("%c\n", '\0');//혹시나 해서 \0을 추가 했습니다
        }
    }
    

    어딘가 문제가 있는 것은 확실한데 어디가 문제인지를 잘 모르겠습니다.

    고수님들 도와주세요!


    8년 전
1개의 댓글이 있습니다.
  • Being
    Being

    문자열의 길이가 항상 80자인가요? 잘 생각해 보시기 바랍니다.


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