Page 75

C++는 C 언어에서 사용하던 스트링 연산에 대한 함수도 제공한다. 이러한 함수는 <cstring> 헤더 파일에 정의돼 있다. 이런 함수는 대체로 메모리 할당 기능을 제공하지 않는다. 예를 들어 strcpy ( ) 함수는 스트링 타입 매개변수를 두 개 받아서 두 번째 스트링을 첫 번째 스트링에

복사한다. 이때 두 스트링의 길이가 같은지 확인하지 않는다. 다음 코드는 이미 메모리에 할당 된 스트링을 매개변수로 받지 않고, 주어진 스트링에 딱 맞게 메모리를 할당한 결과를 리턴하 는 함수를 strcpy ( )에 대한 래퍼 wrapper 함수 형태로 구현한 예를 보여주고 있다. 여기서 스트 링의 길이는 strlen ( ) 함수로 구한다. copyString ( )에서 할당한 메모리는 이 함수를 호출한 측에서 해제해야 한다. char* copyString(const char* str) { char* result = new char[strlen(str)]; // 버그! 한 칸 부족하다. strcpy(result, str); return result; }

위 copyString ( ) 함수 코드에 오류가 하나 있다. strlen ( ) 함수에서 리턴하는 값은 스트링을 저장하는 데 사용된 메모리 크기가 아니라 스트링 길이라는 점이다. 따라서 strlen ( )은 ‘hello’ 란 스트링에 대해 6이 아닌 5를 리턴한다. 따라서 스트링을 저장하는 데 필요한 메모리를 제대 로 할당하려면 문자 수에 1을 더한 크기로 지정해야 한다. 항상 +1이 붙어서 지저분하지만 어쩔 수 없다. C 스타일의 스트링을 다룰 때는 항상 이 점을 명심해야 한다. 위 함수를 제대로 작성하 면 다음과 같다. char* copyString(const char* str) { char* result = new char[strlen(str) + 1]; strcpy(result, str); return result; }

여러 스트링을 조합해서 만든 스트링을 할당하는 경우를 생각해보면 왜 strlen ( ) 함수가 스 트링에 담긴 실제 문자 수만 리턴하도록 구현됐는지 이해할 수 있다. 예를 들어 인수로 받은 스트링 세 개를 하나로 합쳐서 리턴하는 함수를 생각해보자. 이때 결과로 나오는 스트링에 대 한 메모리 공간은 얼마가 필요할까? 스트링에 딱 맞게 공간을 할당하려면 세 스트링의 길이를

2장 스트링과 스트링 뷰 다루기 127

Profile for 한빛미디어

전문가를 위한 C++ (개정4판) - 맛보기  

『전문가를 위한 C++』(개정4판)은 새로 추가된 기능과 관련 도구를 비롯해 C++에 대한 모든 내용을 코드와 솔루션 위주로 소개한다. 저자는 실전 프로그래밍에 적용할 수 있는 현실적인 기법을 다양하게 소개하였으며, 본 교재는 C++를 더 깊이 이해하...

전문가를 위한 C++ (개정4판) - 맛보기  

『전문가를 위한 C++』(개정4판)은 새로 추가된 기능과 관련 도구를 비롯해 C++에 대한 모든 내용을 코드와 솔루션 위주로 소개한다. 저자는 실전 프로그래밍에 적용할 수 있는 현실적인 기법을 다양하게 소개하였으며, 본 교재는 C++를 더 깊이 이해하...

Advertisement