본문으로 바로가기
728x90
반응형
strncat() 함수의 헤더 파일
#include <string.h>

 

strncat() 함수의 원형
char * strncat ( char * des, char * src, size_t num);

 

Parameter
dse
src 문자열을 복사할 위치 문장열의 위치이며 des 문자열 뒤에 src 문자열이 복사된다.

src
des 뒤에 복사할 문자열의 주소이며 char * 형의로 되어 있다.

num
복사할 데이터의 byte 수이며 size_t 형으로 전달해주면 된다.

 

strncat 함수는 strcat 한수와 더불어 문자열을 병합해주는 함수 중에 하나입니다.

 

strcat 함수와 거의 동일한 동작을 하지만 차이가 있다면 복사할 크기를 지정해줄 수 있다는 특징이 있습니다.

(string.h 헤더파일에 있는 함수들 중 ~~n~~ 인 함수는 모두 크기를 지정할 수 있는 함수랍니다.

eg. strncpy, strncat, strncmp)

 

복사할 크기를 지정해 줄 수 있는 함수들의 가장 큰 장점은 buffer overflow를 방지할 수 있다는 점인데요.

정확한 크기만큼만 복사하기 때문에 많이들 사용합니다.

잠깐! 여기서 buffer overflow란??

buffer overflow를 이해하기 위해서는 컴퓨터 메모리 구조를 이해하셔야 되는데요.
컴퓨터 메모리 구조는 복작한 개념들이 포함되어 있으므로 다른 포스팅에서 다루겠습니다.
간단히 설명하면 배열이나 포인터에 할당된 메모리보다 큰 메모리를 할당할 경우 발생하게 됩니다.

 

그리고 또 하나 중요한 점은 strcat() 와 마찬가지로 des 문자열 마지막에 '\0'이 있어야 됩니다.

strcat() 함수는 des, src 모두 '\0' 문자를 기준으로 문자열을 잘랐지만 strncat() 함수는 des 문자열만 '\0'을 기준으로 묹자열을 구분하고 src 문자열은 입력된 크기만큼 문자열을 구분해줍니다.

 

 

자 이제 strncat를 사용해보죠!

#include <stdio.h>
#include <string.h>

static void print_str(char * note, char * _str1, char * _str2, char * _des){
  printf("*************************\n");
  printf("[%s addr and str]\n", note);
  printf(" - str1 addr : %x\n", _str1);
  printf(" - str2 addr : %x\n", _str2);
  printf(" - des addr : %x\n\n", _des);

  printf(" - str1: [%s]\n", _str1);
  printf(" - str2: [%s]\n", _str2);
  printf(" - des: [%s]\n", _des);
  printf("*************************\n");
}

int main(){
  char str1[20] = "hello ";
  char str2[20] = "world!!";
  char * des = NULL;

  print_str("before", str1, str2, des);		//비교용 before log

  des = strncat(str1, str2, 7);			// strncat() 함수로 str1 뒤에 str2의 7바이트를 병합

  print_str("after", str1, str2, des);		//비교용 after log

  return 0;
}

 

실행 결과

 

그럼 des 문자열에 '\0'문자열에 없으면 어떻게 될까여?

#include <stdio.h>
#include <string.h>

static void print_str(char * note, char * _str1, char * _str2, char * _des){
  printf("*************************\n");
  printf("[%s addr and str]\n", note);
  printf(" - str1 addr : %x\n", _str1);
  printf(" - str2 addr : %x\n", _str2);
  printf(" - des addr : %x\n\n", _des);

  printf(" - str1: [%s]\n", _str1);
  printf(" - str2: [%s]\n", _str2);
  printf(" - des: [%s]\n", _des);
  printf("*************************\n");
}

int main(){
  char str1[20];
  char str2[20] = "world!!";
  char * des = NULL;

  memset(str1, 0x30, 20);		//20byte를 모두 0x30으로 초기화
  memcpy(str1, "hello ", 6);		// hello 문자열을 복사

  print_str("before", str1, str2, des);

  des = strncat(str1, str2, 7);		// str1 문자열에 str2 문자열 7byte를 복사

  print_str("after", str1, str2, des);

  return 0;
}

 

실행 결과

 

strncat() 함수에서 기억해야될 포인트

1. des 문자열의 구분은 '\0' 문자를 기준으로, src 문자열은 입력된 크기만큼!!

2. des 문자열이 num byte 만큼 메모리에 공간이 할당되어 있어야 됩니다.



출처: https://idsn.tistory.com/46 [Daily Study Note]

다른 string.h 파일의 함수에 대해 알고 싶으시다면 String.h 함수 파헤치기!!

 

C언어 라이브러리 - String.h 헤더 파일 분석하기(String.h 함수 모음, C언어 래퍼런스)

c언어를 사용하시거나 해보셨던 분들은 대부분 memcpy, memset 함수를 사용해보셨을 텐데요. 해당 함수를 사용하기 위해서는 String.h 파일을 포함시켜줬던 기억이 나실겁니다. 요렇게요 #include #include

idsn.tistory.com

반응형