2010-12-05 7 views
0

소켓에서 읽고 printf (필수)를 사용하여 stdout으로 인쇄하려고합니다.char *의 printf가 세그먼트 오류를 ​​가져옴

그러나 정교한 웹 사이트에서 특정 파일 (HTML)을 읽을 때마다 Segmentation Fault가 발생합니다.

이 코드를 살펴보고 잘못된 점을 알려주십시오.

int total_read = 0; 
char* read_buff = malloc(BUF_SIZE); 
char* response_data = NULL; 
if (read_buff == NULL){ 
    perror("malloc"); 
    exit(1); 
} 
while((nbytes = read(fd, read_buff, BUF_SIZE)) > 0){ 
    int former_total = total_read; 
    total_read += nbytes; 
    response_data = realloc(response_data, total_read); 
    memmove(response_data + former_total, read_buff, nbytes); //start writing at the end of spot before the increase. 
} 
if (nbytes < 0){ 
    perror("read"); 
    exit(1); 
} 

printf(response_data); 

감사합니다.

+1

당신은 당신의 문제를 해결 대답하여 체크 모양의 아이콘을 클릭합니다. – erjiang

+1

response_data에는 어떤 내용이 들어 있을까요? printf 형식화 문자가 포함되어 있으면 printf는 전달하지 않은 매개 변수에 액세스하려고 시도합니다. 시도 대신에 넣어? –

답변

9

response_data은 아마도 NUL ('\0')이 종료되지 않았으므로 printf은 문자열 끝을 지나서 계속됩니다. 또는 % 지시어를 포함 할 수도 있지만 printf은 더 이상 인수를 찾을 수 없습니다.

대신 printf까지 읽으려면 이 아니고이 아니어야 문자열에 % 지시어를 해석하십시오. response_data가 포함 된 NUL을 포함하는 경우, printftotal_read 긴 경우에도이 중단됩니다

printf("%.*s", total_read, response_data); 

참고.

+1

하나의 수정은 다음과 같습니다. printf ("%. * s", total_read, response_data); (별표 앞에 dont). –

+0

@Luis : 'response_data'에 NUL이 내장되어있는 경우에만 중요합니다.'% * s '는 공백으로 채워지고,'% - * s' 패드는 공백으로 채워지고,'%. * s'에는 공백이 없습니다. 모든. 어떤 OP가 원하는지에 달려 있습니다 ... – ephemient

+0

하지만 문자열 형식의 정밀도는 인쇄 할 수있는 최대 문자 수입니까? –

1

response_data에는 어떤 내용이 들어 있을까요? printf 형식의 문자 (예 : % 다음에 일반적인 옵션 중 하나가 오는 문자)가 포함되어있는 경우 printf은 전달하지 않은 매개 변수에 액세스하려고 시도하며 세분화 오류가 발생할 가능성이 큽니다. 대신 puts을 사용해보세요.

당신의 printf를 사용해야하는 경우

printf("%s", response_data)을 (그리고 먼저 NUL은-종료) 귀하의 게시물이 응답이 HTML 데이터 점이다에서

+0

감사합니다, 이것은 작동합니다. 나는 아직도 사용할 양식을 고려하고있다. – SnapDragon

-2

내 이해를.
텍스트이므로 인쇄하려고합니다. 당신이하는 것처럼 printf를 사용하지 마십시오.
대신 다음을 수행하십시오

for(int i = 0; i < total_read; i++) 
    putc(response_data[i],stdout); 
+0

이것은 아마도 내가 본 중 가장 느린'putc' 대신에 가장 느린 대체물입니다 ... –

+0

Putc은 여전히 ​​이것을 수행하는 방법이 아닙니다. printf "% .s"가하는 것을 다시 구현하고 있습니다. –

관련 문제