C에는 라이브러리가 있지만 기본 제공 정규 표현식이 없습니다. http://www.arglist.com/regex/, http://www.pcre.org/은 내가 가장 자주 보는 두 가지입니다.
이 작업을 간단하게 수행하면 정규식을 사용하지 않고도 쉽게 벗어날 수 있습니다. 선이 약간의 최대 길이 MAXLEN
보다 모두 적게되어 제공, 단지 한 번에 한 라인을 처리 :
char buf[MAXLEN];
char url[MAXLEN];
char host[MAXLEN];
int state = 0; /* 0: Haven't seen GET yet; 1: haven't seen Host yet */
FILE *f = fopen("my_input_file", "rb");
if (!f) {
report_error_somehow();
}
while (fgets(buf, sizeof buf, f)) {
/* Strip trailing \r and \n */
int len = strlen(buf);
if (len >= 2 && buf[len - 1] == '\n' && buf[len - 2] == '\r') {
buf[len - 2] = 0;
} else {
if (feof(f)) {
/* Last line was not \r\n-terminated: probably OK to ignore */
} else {
/* Either the line was too long, or ends with \n but not \r\n. */
report_error_somehow();
}
}
if (state == 0 && !memcmp(buf, "GET ", 4)) {
strcpy(url, buf + 4); /* We know url[] is big enough */
++state;
} else if (state == 1 && !memcmp(buf, "Host: ", 6)) {
strcpy(host, buf + 6); /* We know host[] is big enough */
break;
}
}
fclose(f);
즉에 의해 미세 비록 (KennyTM의 대답처럼 메모리에 전체 파일을 버퍼링이 필요하지 않습니다이 솔루션 파일이 작다는 것을 안다면 길). 안전하지 않은 gets()
대신에 fgets()
을 사용합니다. 긴 행의 버퍼 오버플로가 발생하기 쉽습니다.
'strstr()'을 몇 번 호출하면 필요한 모든 것이 가능할 것입니다. 까다로운 부분은 URL에 "HTTP/1.1"이 들어있는 경우를 처리하는 것입니다. 그리고이 문제는 regex lib (C에서 존재하지만 표준 라이브러리에없는 라이브러리)를 사용하더라도 존재합니다. –
좋아, 나는이 모든 것을 시도하고 다시, 당신에게 돌아갈거야, 고마워! – trinity