2014-02-17 2 views
0

웹 로그에서 조각을 파싱하는 C++ 프로그램을 작성 중이며 원하는 페이지 중 하나가 요청 된 페이지입니다. 나는 string::find을 사용하여 페이지의 시작과 끝을 정의한 다음 string::substr을 사용하여 추출합니다. 다음 예제 라인 :string에 문제가 있습니다 :: find

172.138.80.174 - - [05/Aug/2001:21:06:27 -0300] "GET /~csc226 HTTP/1.0" 301 303 "http://www.goto.com/d/search/?Keywords=stringVar+%2B+savitch&view=2+80+0&did=" "Mozilla/4.61 [en] (Win98; I)" 

요청 된 페이지가 GET 후 일부 권리가가, 그리고 HTTP되기 전에 끝이 맞다, 그래서 내가 좋아하는 뭔가를 할 :

int beginning = log_entry.find("\"GET") + 5; 
int end = log_entry.find("HTTP) - 5; 
std::string requested_page = log_entry.substr(beginning, end); 

이 다음이다 무슨 일이 requested_page에 포함된다 :

/~csc226 HTTP/1.0" 301 303 "http://www.goto.com/d/search/ 

대신

,617의
/~csc226 

앞에서 알 수 있듯이 시작은 정확하지만 끝은 아닙니다. 위의 예제 엔트리와 같은 구문으로 3000 줄의 로그를 가지고 있으며 요청 된 페이지의 시작은 모두 정확하며 끝은 없습니다.

어떤 아이디어가 잘못 되었나요?

감사합니다.

답변

3

find의 결과를 int에 저장하지 마십시오. std::string::size_type으로 std::size_t을 사용하십시오.

실패했는지 테스트하려면 std::string::npos과 비교하십시오.

두 번째로 std::string::find의 결과는 npos이 아닌 것으로 확인하고 유효한 범위 내에서 이동한다는 것을 알기 전까지는 결코 조작하지 마십시오. +5-5은 맹목적으로 이동하지 않습니다. 나는 당신이 당신의 데이터가 무엇인지 "안다"면 상관하지 않는다. 버퍼 오버플로 코드를 작성하지 마십시오.

마지막으로, substr(start, LENGTH)substr(start, end)이 아닙니다.

std::string은 표준 컨테이너가 아닌 다른 소스 라이브러리에서 가져 왔습니다. 그래서 그것의 관습은 매우 다릅니다 (그리고 종종 더 나빠집니다).

+0

오케이, 설명서를 미리 읽어야합니다. 명확하고 간결한 설명을 주셔서 감사합니다. 정확하게 제가 찾고 있던 것이 었습니다! – user3026053

0
172.138.80.174 - - [05/Aug/2001:21:06:27 -0300] "GET /~csc226 HTTP/1.0" 301 303 "http://www.goto.com/d/search/?Keywords=stringVar+%2B+savitch&view=2+80+0&did=" "Mozilla/4.61 [en] (Win98; I)" 

그래서 : "GET을 다음 위치에 5 곳 앞으로 반복자를 이동 : log_entry.find("\"GET") + 5;이 일치합니다

172.138.80.174 - - [05/Aug/2001:21:06:27 -0300] "GET /~csc226 HTTP/1.0" 301 303 "http://www.goto.com/d/search/?Keywords=stringVar+%2B+savitch&view=2+80+0&did=" "Mozilla/4.61 [en] (Win98; I)" 
                ^

다음`log_entry.find ("HTTP"); HTTP :

172.138.80.174 - - [05/Aug/2001:21:06:27 -0300] "GET /~csc226 HTTP/1.0" 301 303 "http://www.goto.com/d/search/?Keywords=stringVar+%2B+savitch&view=2+80+0&did=" "Mozilla/4.61 [en] (Win98; I)" 
                  ^

(size_t length = log_entry.find("\"HTTP") - log_entry.find("\"GET") - 5;)을 사용하고 싶습니다. 마지막으로 std :: string :: substr을 올바르게 사용해야합니다. here.

관련 문제