더북(TheBook)

TAKEAWAY 6.16 스트링 함수에 스트링이 아닌 인수를 전달하면 예측할 수 없는 동작이 발생한다.

이렇게 잘못 입력할 때 흔히 볼 수 있는 현상은 다음과 같다.

strlen과 같은 함수는 0 문자를 찾지 못하기 때문에 결과가 리턴될 때까지 오래 걸린다.

배열 오브젝트의 경계를 벗어난 영역에 접근해서 세그먼테이션(segmentation) 오류가 발생한다.

허용되지 않은 영역에 데이터를 쓰면 데이터가 손상된 것처럼 보인다.

따라서 스트링 인수에 전달하는 값이 실제 스트링인지 반드시 확인해야 한다. 문자 배열의 길이는 아는데 0으로 끝나는지는 모른다면 strlen보다는 memchr과 포인터 연산(11장 참고)을 이용하는 것이 안전하다. 마찬가지로 스트링이 아닌 문자 배열은 memcpy로 복제하는 것이 좋다.Exs 1

지금까지 설명하면서 언급하지 않은 중요한 사실 한 가지가 있다. 바로 함수 프로토타입이다. 스트링 함수의 프로토타입은 다음과 같다.

size_t strlen(char const s[static 1]);
char* strcpy(char target[static 1], char const source[static 1]);
signed strcmp(char const s0[static 1], char const s1[static 1]);
signed strcoll(char const s0[static 1], char const s1[static 1]);
char* strchr(const char s[static 1], int c);
size_t strspn(const char s1[static 1], const char s2[static 1]);
size_t strcspn(const char s1[static 1], const char s2[static 1]);

 

 


Exs 1 memchrmemcmp를 이용하여 strcmp의 경계 검사 버전을 구현해 보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.