본문 바로가기
컴퓨터 공학/C, C++

[ C ] 문자열 함수 이해하기6_입출력 이외의 문자열 관련 함수_strlen, strcpy, strcat, strcmp

by hahehohoo 2020. 7. 22.
반응형

C언어 입출력 이외의 문자열 관련 함수_strlen, strcpy, strcat, strcmp

 

 

 

C언어는 문자열을 담을 수 있는 자료형이 없습니다. 그래서 char로 배열을 만들어 사용합니다. 하지만 배열만으로 전체 길이 알아내는 등 데이터를 처리하는데 번거로움이 있기 때문에 유용한 함수를 잘 활용하면 좋습니다

참고할만 한 글: C 스타일 문자열 개념

참고할만 한 글: 문자열 길이를 알 수 있는 함수 strlen 

■ 문자열을 복사하는 함수: strcpy, strncpy

char* strcpy(char * dest, const char * src);

char* strncpy(char * dest, const char * src, size_t n);

 

strcpy 함수는 아래와 같이 호출하면 됩니다. 

int main(void)
{
   char str1[30] = "What a beautiful day!";
   char str2[30];
   strcpy(str2, str1); // str1의 문자열을 str2에 복사
   puts(str2);
   return 0;
}

 

strncpy 함수는 아래와 같이 호출하면 됩니다. 

int main(void)
{
   char str1[30] = "What a beautiful day!";
   char str2[30];
   char str3[4];
   
   strcpy(str2, str1, sizeof(str3)); // str1의 문자열을 sizeof(str3)만큼 str2에 복사
   puts(str2);
   return0;
}

위 코드 결과는 어떨까요?

str1에서 sizeof(str3)크기인 4만큼 문자를 가져오면 'What'이 되겠네요. 하지만 실제로 실행결과는 이렇게 나옵니다.

What{]|[

4개의 문자가 들어있지만 그 안에 널문자는 없으니 배열을 출력할 때 컴파일러는 어디까지 읽어야할지 몰라 엉뚱한 영역까지 출력합니다. 

따라서 strncpy 함수를 호출할 때는 세번째 인자로 배열의 실제 길이보다 하나 작은 값을 전달해서 널 문자가 삽입될 공간을 남겨두고 복사를 진행해야 합니다. 그리고 이어서 배열의 끝에 널 문자를 삽입해야 합니다.

 

int main(void)
{
   char str1[30] = "What a beautiful day!";
   char str2[30];
   char str3[4];
   
   strcpy(str2, str1, sizeof(str3)-1);
   str3[sizeof(str3)-1]=0;
   puts(str3);
   return 0;
}

 

 

 


■ 문자열을 덧붙이는 함수: strcat, strncat

char* strcat(char * dest, const char * src);

char* strncat(char * dest, const char * src, size_t n);

 

이 두 함수는 문자열의 뒤에 다른 문자열을 복사합니다. 

strcat 함수는 아래와 같이 호출하면 됩니다. 

int main(void)
{
   char str1[30] = "No idea";
   char str2[30] = "at all";
   strcat(str1, str2); // str2을 str1에 덧붙임
   puts(str1);
   return 0;
}

위 코드의 실행 결과는 이러합니다. 

No ideaat all

 

그림에서 알 수 있듯이 널 문자(\0)가 있는 위치에서 복사가 시작됩니다. str2의 널문자는 남아있습니다.


strncat 함수는 아래와 같이 호출하면 됩니다. 

int main(void)
{
   char str1[30] = "No idea";
   char str2[30] = "at all";
   strcat(str1, str2, 2); // str2을 str1에 2개만 덧붙임
   puts(str1);
   return 0;
}

실행 결과

No ideaat

strncat 함수의 세번째 인자에는 복사할 데이터의 길이를 넣으면 됩니다. 또한 자동으로 널 문자를 따로 삽입하기 때문에 위 경우처럼 2개의 문자를 복사하더라도 널문자까지 포함하여 총 3개의 문자가 덧붙여집니다.  

 

 

 

 


■ 문자열을 비교하는 함수: strcmp, strncmp

char* strcmp(char * s1, const char * s2);

char* strncmp(char * s1, const char * s2, size_t n);

 

두 문자열의 내용을 비교하여 다음과 같은 결과를 반환합니다. 

s1이 더 크면 0보다 큰 값 반환

s2가 더 크면 0보다 작은 값 반환

s1과 s2의 내용이 모두 같으면 0

 

여기서 크고 작음은 아스키 코드 값을 기준으로 결정됩니다. 

그래서 "ABCD"와 "ABCDE"를 비교한다고 하면 첫 번째 문자부터 비교가 시작되어 네 번째 문자까지 비교가 진행됩니다. 

네 번째까지 동일하다가 다섯 번째에서는 널문자와 'E'를 비교해야 하네요. 널의 아스키 코드 값은 0이라 'E'의 아스키 코드 값보다 작으므로 음수가 반환됩니다. 

 

 

일반적으로 strcmp 함수를 호출할 때는 '0이 반환되면 동일한 문자열, 0이 아닌 값이 반환되면 동일하지 않은 문자열' 이 두 가지만 근거하여 코드를 작성합니다. 

 

 

 

-----------------------------------

C언어 문법 총정리

목록 보러가기 

-----------------------------------

반응형


댓글