c언어 strcat 함수는 문자열을 이어 붙이기 할 수 있는 함수입니다. 구현 또한 복잡하지 않으니 간단하게 해 보도록 하겠습니다. strcpy 함수와 비슷한 점이 많을 것이니 아래 글을 보고 오셔도 좋겠습니다.
- strcpy 함수에 대해 알아봅시다. 링크
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc3.png)
먼저 각 인자들과 리턴값에 대한 설명은 아래와 같습니다.
- 리턴 값
- dest의 주소
- dest
- 복사 받을 문자열의 주소 (붙여질 대상이 되는 문자열)
- ori
- append 할 문자열. 원본을 의미합니다.
쉽게 말해, ori는 append를 할 원본 문자열의 시작 주소. dest는 붙여질 (append가 되어질) 대상의 시작 주소를 의미합니다. 이 함수가 어떻게 동작하는지 도식화 해서 그려보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc7.png)
ori와 dest가 있습니다. ori는 원본 문자열이고, dest는 붙여 넣기의 대상이 될 문자열입니다. 우리는 이 두 개만 알고 있습니다. dest 뒤에 ori가 붙여진다면, “abcdef”가 될 겁니다. 먼저, dest의 시작 위치부터, 문자열의 끝을 만날 때 까지 탐색합니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc8.png)
a, b, c를 만나고 나니, 회색이 나왔습니다. 회색은, 문자열의 끝을 의미합니다. dest의 4번째 위치부터 복사를 받게 됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc9.png)
먼저 dest의 4번째 위치에 d가 복사됩니다. 5번째 위치에는 무엇이 복사될까요?
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc10.png)
e가 복사될 겁니다. 이런 식으로 계속 탐색을 하는데요. 언제까지 탐색을 할까요? 원본 문자열을 탐색했는데, nil 문자를 만나면 종료하겠지요?
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc11.png)
nil 문자를 만나면, dest에 nil 문자를 채워주고 종료합니다. 여기까지 보면 strcpy와 사실 별 다를 게 없어 보입니다. 단지 추가되는 것은 dest의 복사 시작 위치가 strcpy는 1번째 위치였다면, strcat는 문자열의 길이번째 부터인 것입니다.
즉, 복사가 시작될 위치를 찾는 연산이 추가된다고 보시면 됩니다. 정리하면 아래와 같습니다.
- append가 시작될 위치를 찾습니다.
- 원본 문자열을 append가 시작될 위치부터 복사해서 붙여 넣습니다.
- 이 부분은 strcpy 함수와 동일합니다.
dest 문자열의 길이가 ori 문자열보다 매우 긴 경우에는 불필요한 연산을 합니다. dest 문자열의 끝을 찾는 연산이 가볍지 않기 때문에 주의를 할 필요가 있어요.
이제 예제를 몇 개 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc1.png)
먼저 예제 1번 프로그램을 보겠습니다. ori 문자열에 abc를 복사합니다. 다음에, 기존 ori 문자열에 def를 이어 붙입니다. 그러므로 결과는 abcdef가 나오게 됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc2.png)
정말 그렇게 나오네요. 이제 이것을 직접 구현해 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc4.png)
my_strcat 입니다. 먼저 2번째 줄을 봅시다. dest[pos]가 nil이 아닐 때 까지, 계속 pos 값을 증가시킵니다. 이 loop가 끝나고 나면, pos는 문자열 dest의 끝을 가리킬 겁니다. 이제, source 문자열의 처음 위치부터 nil을 만날 때 까지, dest에 복사합니다.
다음, 마지막 줄에 dest[pos]에 nil을 집어넣습니다. dest 문자열에서 nil을 만날 때 까지 pos 값을 증가시키는 연산을 하는 것 빼고는 strcpy와 동일합니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc5.png)
이제 main에서는 구현된 my_strcat 함수를 사용하면 됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/c_strc6.png)
결과는 abcdef가 나옵니다.
주의사항이 없을까요? 문자열 뒤에 다른 문자열을 덧붙이는 형태의 함수입니다. 기능만 다를 뿐이지, 본질적인 것은 strcpy 함수와 동일합니다. 심지어 경계 검사를 하지 않는 것도 같습니다. 따라서 아래 주의 사항을 strcpy와 공유합니다.
- dest와 ori 문자열의 공간이 겹치면 안 됩니다.
- 경계 검사를 하지 않으므로, 적절한 처리를 해야 한다.