2010-12-10 6 views
1

나는 u_chars 배열을 가지고 있으므로 printf를 사용하여 인쇄하려고합니다. 배열의 크기를 알지 못합니다.u_chars 배열 인쇄

u_char *ip_p; 
printf("%s", ip_p); // EXC_BAD_ACCESS D:< 

인쇄하고 싶습니다. 어떻게해야합니까?

+0

'* ip_p'가 'NULL'종료되지 않은 블록을 가리키면이 문제가 발생합니다. 'ip_p'가 가리키는 방법은 read-in/acquired/etc를 차단하는 것입니다. – birryree

+0

원시 데이터에서 할당 된 구조체에 있습니다. 그것은 실제로 NULL로 종료되지 않습니다. 그러나 배열의 크기를 모르면 어떻게 NULL 문자를 추가 할 수 있습니까? –

답변

6

할 수 없습니다. 포인터는 가리키는 데이터의 크기에 관한 정보를 마술처럼 포함하지 않습니다.

규칙 (터미네이터 바이트 또는 어딘가에 인코딩 된 길이)이없는 경우 유효한 데이터의 양과 인쇄 할 수있는 양을 알 수 없습니다.

0

ip_p이 NUL 종료되면 코드가 작동합니다. 귀하의 코드 조각에서 코멘트를 보면 나는 그것이 끝나지 않았다고 말할 것입니다 ...

1

크기를 모르는 경우, printf을 어떻게 알 수 있습니까? 추가 인수로 크기를 전달하도록 코드를 수정하십시오. 그렇다면 다음을 사용할 수 있습니다 :

printf("%.*s", size, buf); 

그러나 데이터는 텍스트가 아닌 바이너리처럼 보입니다. 그렇다면 printf ... printf으로 인쇄의 가치에 질문하십시오 ...

0

데이터 크기를 모르는 경우 어떻게 사용 하시겠습니까? 크기는 어딘가에서 사용할 수 있었음에 틀림 없다. 너는 크기를 알거나 문자와 같은 센티널 값을 가져야한다.

nul이 종료되지 않은 경우 "% s"은 부적절한 형식 지정자입니다. 또한 u_char 값이 모두 인쇄 가능한 문자가 아닌 경우 % s 또는 % c를 사용하면 안됩니다. % c를 사용하고 인쇄용이 아닌 문자를 다른 것으로 대체 할 수 있습니다.