강좌 & 팁
글 수 2,412
2011.11.11 20:59:29 (*.138.143.120)
38703
문자열 변수에서 문자열 변수로 복사하는 함수로 strcp()가 있습니다. 사용하기 매우 편하지요.
#include <stdio.h> #include <string.h> int main( void) { char str_buffer[50]; ptr = strcpy( str_buffer, "forum.falinux.com"); return 0; }
strcpy() 보다 더 편한 함수가 있습니다. 바로 sprintf()입니다. 포맷에 맞추어 문자열을 만들 수 있기 때문입니다.
sprintf( ptr, "%d %x %s", 123, 123, "forum.falinux.com");
그러나 이 두 함수는 편하기는 하지만 제대로 사용하지 않으면 프로그래머를 매우 괴롭히는 고약한 모습으로 바뀝니다. 이유는 간단합니다. 두 함수 모두 저장 대상의 변수가 가지고 있는 메모리 공간의 크기를 염두하지 않고 지시한 대로 처리하기 때문입니다.
특히, 통신으로 다른 사람이 보내 준 데이터의 바이트의 개수가 준비한 버퍼의 크기보다 항상 작다는 것이 보장되지 않는다면, 평상 시 잘 되는 프로그램이 아상하게 중간에 죽어 버리는 경우 같은 안타까운 일이 발생하게 됩니다.
상황이 자신이 없을 때에는 strcpy() 대신에 memcpy()를 대신 사용합니다.
#define BUFF_SIZE 1024 char buff[BUFF_SIZE]; : memset( buff, 0, BUFF_SIZE); memcpy( buff, pdata, BUFF_SIZE);
만일 버퍼로 수신한 데이터가 반드시 NULL 로 끝나야 한다면, 예를 들어 printf() 나 fputs()를 사용할 경우라면 아래와 같이 버퍼 보다 하나 적게 복사합니다.
memset( buff, 0, BUFF_SIZE);
memcpy( buff, pdata, BUFF_SIZE-1);
그렇다면 sprintf()는 어떻게 사용해야 안전할까요? 답은 따로 없습니다. 안전하게 사용하십시오. ^^;