2016-10-23 4 views
3

일부 네트워크 코드에서 소켓을 통해 (2)를 보내려면 버퍼에 패킷 구조를 인코딩해야하지만 더 큰 버퍼에 인코딩 된 버퍼를 memcpy'ing하면 문제가있는 것 같습니다. 여기에 내가 뭐하는 거지 설명하는 작은 코드 예제 :C memcpy를 사용하여 문자열 연결을 추가하지 않음

char tbuf[] = "test"; 
char *buf = malloc(300); 
memset(buf, '\0', 300); 

int  bytes_to_copy = 300; 
int  bytes_copied = 0; 

while (bytes_copied < bytes_to_copy) { 
    memcpy(buf + bytes_copied, tbuf, sizeof(tbuf)); 
    bytes_copied += sizeof(tbuf); 
} 
/* free, return */ 

이 60 배 단 하나의 "테스트"를 포함하는 끝 버피 버피 만에 "테스트"를 추가해야한다. memcpy를 잘못 사용하고 있습니까?

답변

5

테스트가 끝날 때 null 종결자가 반복적으로 복사됩니다. sizeof tbuf은 5입니다.

그래서 모든 C 표준 라이브러리 함수는 다른 모든 연결 문자를 무시합니다.

해결 방법 : memcpy에 1 바이트 미만을 복사하고 최종 문자열에 널 종결자를 추가하십시오.

+0

memcpy (buf + bytes_copied, tbuf, sizeof (tbuf) - 1); – yrmt

+0

이것은 nul 터미네이터를 포함하지 않지만 여전히 동일한 문제가 있기 때문에 작동합니다. – yrmt

+0

'bytes_copied'를 증가시키는 다음 줄을 잊지 마십시오. – Elyasin