문자열 다룰 때, strcpy 함수를 많이 쓰곤 했습니다. 그런데, stpcpy 정도는 알아두어도 크게 손해볼 거 같지는 않았습니다. 백준의 몇몇 문자열 관련 문제들을 풀어보면서 뼈저리게 느끼기도 했고요. man 페이지를 읽어보면 공부할 만한 키워드들이 상당히 많이 나오는데요. 그것들에 대한 자세한 내용들은 하나 하나 시스템에 대해 공부하면서 파 보기로 합시다. 

 

 

 먼저, stpcpy는 strcpy와 하는 일이 매우 유사해 보입니다. src가 가리키는 문자열의 내용을 dest에 복사한다는 것도 같아 보이고요. 그런데, 오늘 배울 함수는 리턴 값이 its end라고 합니다. 이게 무슨 이야기인지 잘 모르겠군요.

 

 


 코드를 하나 작성해 봅시다.

 

 

 예제 프로그램은 위와 같습니다. 실행 결과는 어떻게 나왔을까요?

 

 

 

 이렇게 나왔습니다. 왜 이렇게 나왔을까요? 일단, 6번째 줄의 char *p = str; 문장부터 보도록 하겠습니다.

 

 

 str은 배열의 시작 주소입니다. 이 값을 p에 대입하였으므로, p는 배열의 시작 주소를 가지고 있습니다. 다음에, 해당 함수로, "cho"를 p에다가 복사를 하는데요. 그러면 아래와 같이 copy가 될 겁니다.

 

 

 여기서, its end란, copy가 되고 난 후에, p의 위치부터 보았을 때, 문자열의 끝을 말합니다. 즉 널 문자가 나오는 위치를 말하는데요. 이 위치는 제가 보라색으로 칠한 칸입니다. 따라서, strcpy는 보라색 주소를 리턴하게 되고, 이 값을 p에다가 대입했기 때문에, p는 다음을 가리킵니다.

 

 

 그 다음에, 8번째 줄에서 똑같이 stpcpy 함수를 호출했습니다. 이번에는 1번째 인자가 p이고, 2번째 인자가 "gahui"입니다. 즉, 해당 문자열을 p의 위치로부터 복사하라는 의미입니다.

 

 

 그러나, 이 함수의 리턴 값을 p에다가 대입하지 않았어요. 따라서, 프로그램의 수행이 끝난 후 str은 배열 str의 시작 위치를, p는 &(str[3])을 가지고 있습니다. 따라서, str을 print하면 "chogahui"가, p를 print하면 "gahui"가 출력됨니다. stpcpy 함수를 잘 이용하면, 1개 짜리 길이의 문자열들을 n회 붙이기를 할 때, O(n)에 쉽게 할 수 있을 듯 싶습니다.

 

 물론 strlen + strcat을 잘 써도 되긴 하지만, 귀찮긴 합니다. 제가 선호하는 방법은 아닙니다. 

 

 


 그러면 이 프로그램은 수행 결과가 어떻게 나올까요? strcpy는, 리턴 값이 dest 그 자체입니다. 즉, 복사 받는 대상체의 시작 주소인데요. strcpy(p,"cho")의 리턴값은 p입니다.

 

 

 그렇기 때문에, 8번째 줄의 strcpy 함수를 호출하기 전에 p는 str의 시작 주소를 가리키고 있을 것입니다. 이 위치에 "gahui"를 복사한다고 하면, 당연하게도, 덮어 씌워질 겁니다.

 

 

 따라서, str을 출력해도, p를 출력해도 "gahui"가 나옵니다. 리턴 값의 차이가 있다는 것입니다. dest와 src의 영역이 겹치면 안 되고, 복사가 될 target의 버퍼 크기를 넉넉하게 해야 한다는 주의점은 두 함수의 공통점입니다.