URI 문제 %2528 인풋에 대해

  • AlgoPigeon
    AlgoPigeon

    string 클래스 메소드를 이용하여
    입력받은 문자열 s에 각 encoded string이 없을 때까지 find하고 replace하도록 했습니다
    그런데 인풋이 "%2528"일 때 "(" 라도 나올 것이라고 생각했는데 인풋 그대로 "%2528" 나와요ㅜㅜ
    문제에서 요구하는것이 "%2528" -> "%28" 인것은 알고있지만
    제가 지금 작성한 코드에서 "%2528"->"("가 나오지 않는 이유가 궁금합니다

    #include <iostream>
    #include <string>
    #include <cstring>
    using namespace std;
    
    int main(void) {
        int t;
        string s;
        string uri[2][7] = {
            { "%20", "%21", "%24", "%25", "%28", "%29", "%2a" },
            { " ", "!", "$", "%", "(", ")", "*" }
        };
    
        cin >> t;
    
        while (t--) {
            int loc;
            cin >> s;
            for (int i = 0; i < 7; i++) {
                while ((loc = s.find(uri[0][i])) > 0) {
                    s.replace(loc, 3, uri[1][i]);
                }               
            }
            cout << s << endl;
        }
    }
    

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

    find에 대한 사용법이 잘못되어서 그렇습니다. find를 통해서 해당 패턴이 존재하는 위치를 찾는것은 맞습니다만, C++에서 index는 0-based이기 때문에 위의 예제에서는 %25를 발견하면 loc 0이 들어가게 되는데 이 경우는 해당 조건문에서 거짓이기 때문에 replace를 수행하지 않습니다. 정확히는 > 0대신에 string::npos를 사용하시는 것이 맞습니다.


    8년 전 link
  • AlgoPigeon
    AlgoPigeon

    아! 기본적인 걸 간과했었네요
    명쾌한 답변 감사드립니다


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