posix.1-2008에 언급된 c언어 stpcpy 함수는 문자열을 복사하는 함수입니다. strcpy와 어떻게 다른지, 그리고 기존에 알고 있었던 strcat 함수로 문자열 붙이기 할 때와 성능도 비교해 봅시다.
먼저 함수의 원형입니다.
- 리턴값
- 복사된 문자열의 끝. 즉 null 문자가 최초로 나타나는 곳을 의미합니다.
- dst
- 복사받을 문자열의 주소
- src
- 원본 문자열의 주소
dst와 src는 겹치면 안됩니다.
리턴값은 strcpy와 strcat의 경우 dst를 돌려줍니다. stpcpy는 복사된 string의 끝을 리턴합니다. 그것 말고는 strcpy와 동일합니다. 예제를 보면서 이해해 봅시다.
예제 1번 프로그램을 봅시다. 먼저, str에 “ice”를 복사합니다. 그리고, stpcpy 함수로 결과를 리턴 합니다. 이 상황을 그림으로 그려 봅시다.
회색 부분은 널 문자로 채워져 있습니다. stpcpy로 “ice”를 str에 복사하겠습니다.
그러면 요래 되겠지요? 군청색 부분은 널 문자로 복사된 문자열의 끝 부분입니다. 이 군청색 부분을 6번째 줄에서 호출한 함수 stpcpy가 돌려줍니다. 이 위치에 다시 “-“을 stpcpy 함수로 복사합시다.
그러면 “ice” 뒤에 “-“가 붙여집니다. 문자열 끝은 군청색 부분입니다. 따라서, 8번째 줄의 stpcpy 함수는 군청색 부분을 가리키는 포인터를 리턴 합니다.
실행 결과입니다. “ice”, “ice-“, “ice-cream” 순서대로 출력됩니다.
이제, strcat으로 문자열을 붙일 때와 c언어 stpcpy 함수를 이용해서 문자열을 이어 붙일 때 성능을 비교해 보겠습니다.
이 프로그램은 strcat으로 100만번 이어 붙이는 프로그램입니다. 이 함수는 i가 커져도 str의 1번째 위치부터 탐색을 하게 됩니다. 뒤에 1개의 문자만 붙이는 데도요. 따라서, i가 커질수록 매우 비효율적인 로직이 됩니다.
걸린 시간을 봅시다. 7.1초가 걸립니다. 비효율적인 것은 분명합니다.
예제 3번을 봅시다. stpcpy가 복사된 문자열의 끝 지점을 리턴한다고 했어요. 이 리턴값을 다시 재사용하면, strcat과 같은 효과를 낼 수 있어요. 복사된 문자열의 끝 부분을 미리 알고 있다면, str의 처음부터 탐색할 필요가 없습니다.
실행 시간을 측정해 보니, 0.00초가 나옵니다. 예제 2번 프로그램과 다르게 매우 효율적으로 작동함을 알 수 있습니다.