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

 

strcat() 함수의 원형
char * strcat ( char * des, const char * src);

 

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

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

 

strcat 함수의 원형을 보니 딱봐도 des 문자열 끝에 src 문자열을 복사해주는 함수 같죠?

 

그런데 파라미터에 사이즈도 없고 문자열 주소 두개만 달랑 들어가는 걸 보니 strcat 함수 내부는 문자열의 마지막 '\0' 문자를 기준으로 지지고 볶는 거 처럼 보이네요.

 

한가지 생각을 해볼까요?

 

자 여기 HELLO 문자열(문자열 마지막에 SPACE가 있어요! SPACE는 ASCLL CODE로 0x32입니다.)이 있고 WORLD 문자열이 있습니다. 두 문자를 strcat 함수로 병합시키면 strcat 함수 내부에서는 어떻게 동작할까요?

 

아래 그림처럼 우선 HELLO 문자열의 길이를 구하겠죠? 그리고 WORLD 문자열의 길이를 구합니다.

HELLO 문자열의 마지막 문자에 있는 '\0' 문자열에 WORLD 문자열의 길이만큼 복사하면 되겠죠?

단, 중요한 사항이 있습니다. DES 문자열의 공간이 WORLD 문자열 + '\0' 만큼 복사할 여유가 있어야 되요.

 

 

 

그럼 DES 문자열의 공간이 없으면 어떻게 될까요?

 

네 맞아요 메모리에 할당되지 않는 읽기 전용 메모리에는 복사를 진행할 수가 없어요. 그래서 꼭 메모리를 할당 해주시고 복사를 해주셔야되요!!

 

 

 

자 이제 실제 코드로 확인해보죠

 

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

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

  printf("*************************\n");
  printf("[before addr and str]\n");
  printf("str1 addr : %x\n", str1);
  printf("str2 addr : %x\n", str2);

  printf("str1: [%s]\n", str1);
  printf("str2: [%s]\n", str2);
  printf("des: [%s]\n", des);

  des = strcat(str1, str2);		//str1 문자열 뒤에 str2 문자열을 복사합니다.

  printf("*************************\n");
  printf("[after addr and str]\n");
  printf("str1 addr : %x\n", str1);
  printf("str2 addr : %x\n", str2);
  printf("des addr : %s\n", des);

  printf("str1: [%s]\n", str1);
  printf("str2: [%s]\n", str2);
  printf("des: [%s]\n", des);

  printf("*************************\n");

  return 0;
}

 

실행 결과

 

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

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

//  memset(str2, 0x30, 19);

  printf("*************************\n");
  printf("[before addr and str]\n");
  printf("str1 addr : %x\n", str1);
  printf("str2 addr : %x\n", str2);

  printf("str1: [%s]\n", str1);
  printf("str2: [%s]\n", str2);
  printf("des: [%s]\n", des);

  des = strcat(str1, str2);		//str1 문자열 뒤에 str2 문자열을 복사하는데 
  					//메모리가 할당되어 있지 않아 에러가 발생하네요

  printf("*************************\n");
  printf("[after addr and str]\n");
  printf("str1 addr : %x\n", str1);
  printf("str2 addr : %x\n", str2);
  printf("des addr : %s\n", des);

  printf("str1: [%s]\n", str1);
  printf("str2: [%s]\n", str2);
  printf("des: [%s]\n", des);

  printf("*************************\n");

  return 0;
}

 

실행 결과

 

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

1. des, src 문자열 모두 마지막에 '\0'이 있어야 됩니다.

2. des 문자열이 src 문자열 + '\0' 를 복사할 만큼 메모리에 공간이 할당되어 있어야 됩니다.

 

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

 

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

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

idsn.tistory.com

 

반응형