^(코딩캣)^ = @"코딩"하는 고양이;

libc 문자열 조작 함수 정리 (part 02 - strcat, strncat)

Language/C & C++
2018. 8. 18. 23:38

libc 문자열 조작 함수 정리


C 언어에서 문자열 처리는 복잡하다. 언어 수준에서 문자열이라는 데이터 형 자체를 지원하지도 않으니, 덧셈 기호(+)나 비교연산자(==)와 같은 기호를 사용하는 직관적인 문자열 연산을 사용할 수 없기 때문이다. C 언어가 문자열 데이터 형을 지원하지 않고, 문자열을 다루는 연산자도 없으니 모든 문자열 연산은 문자열 함수를 통해 이루어진다. C 표준 라이브러리(일명 'libc')에서 str...로 시작하는 함수들이 그것이며, 모두 string.h 헤더(C++은 cstring 헤더)에 정의되어 있으며 본 시리즈를 통해 이들 함수의 사용법을 정리해보고자 한다. 본 시리즈는 cplusplus(http://www.cplusplus.com) 및 MSDN에 나와있는 레퍼런스를 기준으로 하여 작성되었다.

  1. libc 문자열 조작 함수 정리 (part 01 - strcpy, strncpy)
  2. libc 문자열 조작 함수 정리 (part 02 - strcat, strncat)
  3. libc 문자열 조작 함수 정리 (part 03 - strcmp, strncmp)
  4. libc 문자열 조작 함수 정리 (part 04 - strchr, strrchr)
  5. libc 문자열 조작 함수 정리 (part 05 - strstr)
  6. libc 문자열 조작 함수 정리 (part 06 - strtok)
  7. libc 문자열 조작 함수 정리 (part 07 - strspn, strcspn)
  8. libc 문자열 조작 함수 정리 (part 08 - strlen)
  9. libc 문자열 조작 함수 정리 (part 09 - strpbrk)
  10. libc 문자열 조작 함수 정리 (part 10 - strxfrm, strcoll)
  11. libc 문자열 조작 함수 정리 (part 11 - strerror)

Part II. strcat, strncat


본 포스팅에서는 문자열 결합concatenate을 지원하는 함수인 strcat 계열의 함수에 대해 사용 예를 정리한다.

<Prologue>


strcatstrncat는 문자열 끝에 다른 문자열을 붙이는 역할을 한다. 즉, 원래의 문자열 끝에 있던 NULL ('\0') 문자를 떼고 다른 문자열을 이어 붙인 다음 그 끝에 NULL을 새로 붙이는 역할을 한다. 이 때 원래의 문자열은 수정 가능하여야 하며(즉, 문자열 상수 안 됨), 새로 붙게 될 문자열을 수용할만큼 빈 공간이 충분해야 한다(충분하지 않은 공간에 긴 문자열을 이어붙이면, 메모리가 원래의 영역을 벗어나 다른 프로그램까지 고장나게 만든다. 이를 버퍼 오버플로우buffer overflow라고 하며, C 언어에는 타 메모리 영역의 침범을 감지하여 프로그램을 중지시키는 기능이 없기 때문에 주의해야 한다.

1. strcat


strcat의 원형은 다음과 같다.

char * strcat(char * destination, const char * source);
destination
기존의 문자열이 보관된 수정 가능한 버퍼 주소이다.
source
이어붙일 문자열을 가리키는 주소이다.

source가 가리키는 주소에서 문자를 하나씩 읽어 destination이 가리키는 주소의 문자열에 하나씩 이어 붙인다. 함수가 종료될 때 destination이 가리키는 주소를 그대로 반환한다.

다음은 strcat의 사용 예제이다.

/* strcat.c */
#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[])
{
	char str1[64] = "Cat";                               // string to append
	char str2[64] = "coding";                               // string buffer

	printf("<BEFORE>\n");
	printf("str1 = \"%s\"\n", str1);
	printf("str2 = \"%s\"\n", str2);

	strcat(str2, str1);                                       // concatenate

	printf("<AFTER>\n");
	printf("str1 = \"%s\"\n", str1);
	printf("str2 = \"%s\"\n", str2);

	return 0;
}
[그림 1] strcat.c 예제 소스 코드
[그림 2] strcat.c 예제 소스 코드의 실행 결과

1-1. Wide Character 확장 함수 - wcscat


상기 wcsncat는 ASCII 문자열 또는 UTF-8 인코딩의 Unicode 문자열에 대해 사용 가능하다. UTF-16/UTF-32와 같은 Wide Character 문자열의 결합은 아래의 함수를 사용 가능하며, wchar.h, C++에서는 cwchar 헤더를 include한다.

wchar_t * wcscat (wchar_t * destination, const wchar_t * source);

2. strncat


strncat도 문자열을 이어붙이는 역할을 하는데 매개변수로 지정한 몇 글자까지만 이어붙인다.

char * strncat(char * destination, const char * source, size_t num);
destination
원래의 문자열을 가리키는 수정 가능한 메모리 주소이다.
source
이어붙일 문자열을 가리키는 주소이다.
num
source로부터 복사할 문자의 개수이다.

source가 가리키는 주소에서 문자를 하나씩 읽어 destination이 가리키는 주소의 문자열에 이어붙이는데 그 개수는 num 개로 제한한다. 함수가 종료될 때 destination이 가리키는 주소를 그대로 반환합니다.

아래 코드는 strncat의 사용 예이다.

/* strncat.c */
#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[])
{
	char str1[64] = "Cat, Tiger and Lion";               // string to append
	char str2[64] = "coding";                               // string buffer

	printf("<BEFORE>\n");
	printf("str1 = \"%s\"\n", str1);
	printf("str2 = \"%s\"\n", str2);

	strncat(str2, str1, 3);                                   // concatenate

	printf("<AFTER>\n");
	printf("str1 = \"%s\"\n", str1);
	printf("str2 = \"%s\"\n", str2);

	return 0;
}
[그림 3] strncat.c 예제 소스 코드
[그림 4] strncat.c 예제 소스 코드의 실행 결과

2-1. Wide Character 확장 함수 - wcsncat


상기 wcsncat는 ASCII 문자열 또는 UTF-8 인코딩의 Unicode 문자열에 대해 사용 가능하다. UTF-16/UTF-32와 같은 Wide Character 문자열의 결합은 아래의 함수를 사용 가능하며, wchar.h, C++에서는 cwchar 헤더를 include한다.

wchar_t * wcsncat (wchar_t * destination, const wchar_t * source, size_t num);

<Epilogue>


본 포스팅을 통해 문자열 복사 함수에 대해 정리해 보았다. 다음 포스팅[libc 문자열 조작 함수 정리 (part 03 - strcmp, strncmp)]에서는 문자열을 비교하는 strcmp, strncmp 함수에 대해 정리한다.

카테고리 “Language/C & C++”
more...