2011-08-04 3 views
0
fprintf(fp,"IP: %d: %.*s\n", 
     ip, 
     strstr(strstr(p->data, "User-Agent:"),"\n") - strstr(p->data, "User-Agent:"), 
     strstr(p->data, "User-Agent: ")); 
    fclose(fp); 

안녕하세요. 위의 문장에서 볼 수 있듯이, char 포인터에서 사용자 에이전트 헤더 만 씁니다. 전체 http 패킷 데이터를 포함합니다. 문제는 문자열 형식을 다루고 난 후,이 %. * 형식을 사용하여 파일에 인쇄 할 문자 수를 동적으로 선택한 다음 인쇄합니다. 코드는 기본적으로 int를 출력하고 나서 "User-Agent :"가 발생했을 때부터 다음에 나오는 새 줄 문자까지의 문자 수를 넘기 때문에 문자 양이 시작됩니다 전체 패킷 데이터 문자열에서 "User-Agent :"가 시작되는 위치. 나는 그것이 모두 지저분하다는 것을 알고있다. 그러나 그것은 잘 동작하고있다. 그것은 sprintf에서 작동하지 않는 것을 제외하고.문자열 형식은 fprintf에서 작동하지만 sprintf에서 작동하지 않습니다. 세그먼트 화 오류가 발생합니다.

제 힘겨운 말을 모두 저장하십시오! 어떤 도움을 주셔서 감사합니다!

char *stat; 
    sprintf(stat,"%.*s\0", 
     strstr(strstr(p->data, "User-Agent:"),"\n") - strstr(p->data, "User-Agent:"), 
     strstr(p->data, "User-Agent: ")) ; 
+2

동일한 인수를 사용하여 동일한 'strstr'을 3 회 호출하면 부끄러운 일입니다. 알다시피, 그것은 다소 비싼 기능입니다. –

+0

@Jan :하지만 조기 최적화는 모든 악의 뿌리입니다. 이와 같이 복사하여 붙여 넣는 코드를 작성하지 않은 것이 더 낫지 만 유지하기가 덜 강력하고 어렵다는 것입니다. –

+1

@ Paul R : 네, 유지 보수성 역시 좋은 논거입니다. "조숙 한 최적화"와 관련하여, 조기 최적화는 입증되지 않은 이익을 위해 코드가 더 복잡하지만 코드를 더 간단하고 읽기 쉽게 만드는 것입니다. –

답변

2

을 당신은 stat 메모리를 할당하지 않습니다. 시도해보십시오.

char *stat = malloc(MAXLEN); 
snprintf(stat, MAXLEN, ...); 
^   ^
+0

그건 좋은 생각이야. 마침내 그게 효과가있는거야. –

0

sprintf를 사용할 때 쓸 문자 배열이 필요합니다. 초기화되지 않은 포인터에 쓰려고합니다.

대신을 시도해보십시오

char stat[200]; 
sprintf(stat, etc... 
+0

배열에 char 포인터와 같은 것이 있다고 생각했습니다. 함수에 전달하는 것이 걱정되었습니다. 그래서 내가 그랬던 것처럼 내가 그것을 깨닫고 마침내 그것을 바로 잡았다. 그리고 이것은 정확하게 내가 한 것처럼, 심지어 같은 수 (200)를 선택했습니다. –

0

글쎄, 초기화되지 않은 할당되지 않은 임의의 메모리 위치에 데이터를 쓰려고합니다. 이제는 그럴 수 없습니다.

중 하나를 수행합니다

char stat[SUFFICIENTLY_LARGE_NUMBER]; 
snprintf(stat, SUFFICIENTLY_LARGE_NUMBER, ...); 

나 :

char *stat = malloc(SUFFICIENTLY_LARGE_NUMBER); 
snprintf(stat, SUFFICIENTLY_LARGE_NUMBER, ...); 

있는지 "SUFFICIENTLY_LARGE_NUMBER"를 만들 문자열이에 맞는 불필요하게 큰 충분하지 바이트입니다.

형식 : 길이 제한이 없기 때문에 snprintf입니다. 그렇다면 sprintf은 괜찮지 만 은 무제한 %s과 함께 사용하지 마십시오. 공식적으로는 제한되어 있지만, %.*s은 충분하지 않습니다.식이 할당 된 버퍼의 크기보다 더 행복하게 반환 될 것이므로 오버런을 피하기 위해 다른 검사가 필요합니다.

+0

설명과 sprintf 및 snprintf에 감사드립니다. 나는 존재감조차도 몰랐다. 도와 주셔서 감사합니다! –

관련 문제