2015-02-05 6 views
0

브라우저 요청을 온라인으로 읽고 buff에 저장한다고 가정 해 봅니다. 나는이 광속에서 방법, url, versoin 같이 어떤 정보를 추출하고 싶다. 그래서 그것을 분할하는 strtok_r 사용하고 싶습니다.strtok_r (buff, " r n", & saveptr);을 사용할 때 브라우저 요청에서 물건을 추출하는 프로세스는 무엇입니까?

요청이 "GET http : // ******** HTTP/1.1"이라고 가정합니다. *********는 웹 사이트 링크입니다. 특정 토큰을 설정하고 다음 코드를 사용하십시오.

cmd = strtok_r(buf1, token, &saveptr); 
strcpy(url, strtok_r(NULL, token, &saveptr)); 
version = strtok_r(NULL, token, &saveptr); 

첫째, 토큰을 ""으로 설정 한 경우입니다. 그러면 cmd = "GET", url = "http : // ********"가 표시됩니다. 그러나 VERSION 뒤에는 ""없습니다. 그래서 이것은 문제를 일으킬 수 있습니다.

두 번째로 토큰을 "\ r \ n"으로 설정하면 그런 다음 cmd = "GET http : // ******** HTTP/1.1"을 얻습니다.

올바른 방법으로 토큰을 "\ r \ n"으로 설정할 수 있습니다. 그러나 나는 그 과정을 확신하지 못한다. 아무도 왜이 작품을 설명 할 수 있습니까 ???

+0

[strtok_r]의 문서 (http://linux.die.net/man/3/strtok_r)에이 질문과 관련하여 * 이해하지 못한 * 특정 * 항목이 있습니까? Btw. 누가 각 게시 된 통화에서 * 같은 * 토큰 목록을 사용해야한다고 했습니까? – WhozCraig

+0

토큰을 "\ r \ n"(공백 문자 추가)로 설정하려고 시도합니다. –

+0

질문이 오면 여러 구분 기호'strtok (str, "/");를 사용할 수 있습니다. 이제 공백과 /를 구분 기호로 사용할 수 있습니다 . – Gopi

답변

1

여기에 언급 할 두 가지.

  1. 당신은 strtok()/strtok_r() 개 이상의 구분 기호의 배열을 전달할 수 있습니다. 토큰을 파싱 할 때 을 각 요소를 구분 기호 배열로 간주합니다. man page [강조 광산]에서

DELIM 인수는 문자열 해석 토큰을 ​​구분 바이트의 세트를 지정한다.

파싱 된 문자열에 둘 이상의 연속적인 단락 바이트 시퀀스

단일 분리되는 것으로 간주된다.

  1. strcpy(url, strtok_r(NULL, token, &saveptr)); 이것은 코드를 작성하는 매우 위험한 방법입니다. strtok()이 실패하고 NULL을 반환하면 공포을 생각해보십시오. 이렇게하는 가장 좋은 방법은 strtok()의 반환 값을 다른 변수에 수집하고 NULL 검사 후에 strcpy()에 해당 변수를 사용하는 것입니다.
+0

설명과 조언에 감사드립니다. 감동적인. 두 번째 줄을 "정상적인"방법으로 변경했습니다. – Gongbaochicken

+0

@Gongbaochicken 선생님, 가장 환영합니다. :-) –

1

strtok를 (가족)은 초 (개별 문자가 아닌 시퀀스)에 표시 일어나는 첫 번째 문자열의 모든 문자를 제거하여 작동하고 당신에게 하지에 발생하는 첫 번째 문자열의 포인터을 제공합니다 두 번째 문자열에 해당 문자가 있어야합니다. 이것은 역사적으로 쉘 sh (1)에서 사용되었습니다. 여기서 IFS 환경 변수의 내용을 사용하여 입력 문자열을 나눠서 문자열 배열을 구성하여 exec (2)이되도록 프로그램에 전달합니다.그런데

, 알고리즘은 strtok에 의해 사용 (3) 및 cousings는에 입력 버퍼를 분할 라인 구분 기호를 사용하여, 당신은 (여러 패스 구문 분석 할 일을해야합니다으로, HTTP 입력을 구문 분석 adecuate되지 않는다 두 번째 매개 변수로 공백으로 두 번째 줄)

http 프로토콜을 구문 분석하려면 특정 구문 분석기를 개발하여 언어 구문 분석 기술을 사용하여 항목을 검색하는 것이 좋습니다. 오랫동안 유닉스 시스템에서 표준으로 제공되는 유틸리티의 종류에 대한 도움말은 flex (1) 또는 bison (1)을 참조하십시오.