C & C++

[C언어] 문자열에서 많이 사용되는 함수 : strlen, strcpy, strcat, strcmp

jimmy_AI 2021. 12. 13. 01:14
반응형

C언어 문자열 대표 함수 : strlen, strcpy, strcat, strcmp

이번 포스팅에서는 C언어 문자열을 다룰 때, 많이 사용하는 대표 함수인

strlen, strcpy, strcat, strcmp 함수의 사용 방법과 코드 예시에 대해서

다루어보도록 하겠습니다.

 

C언어 문자열 길이 반환 : strlen

이번 시간에 다룰 함수들을 사용하기 위해서는 string.h 라이브러리를 

불러와야만합니다.

 

따라서, #include <string.h>를 코드 맨 위쪽에 적어주도록 하겠습니다.

 

strlen 함수는 문자열의 길이를 반환합니다. (파이썬의 len 함수와 유사)

이 때, char 배열의 크기는 무관하며, \0(null) 전까지 몇 개의 유효 char 자료형이

있는지를 카운팅 합니다. 예시를 살펴보겠습니다.

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

int main(){

char str_a[10] = "abcdefgh";
char str_b[15] = "hello! hello!";

int len_a, len_b;

// 문자열 길이 반환
len_a = strlen(str_a); // 8
len_b = strlen(str_b); // 13

printf("%d\n", len_a);
printf("%d\n", len_b);

}

첫 번째 문자열인 str_a는 abcdefgh로 총 8개의 문자가 포함되어 있습니다.

배열의 크기는 10이지만, 문자는 8개이고, 9번째에 null이 포함되어 있기에

strlen의 결과는 8입니다.

 

두 번째 문자열도 마찬가지로 !, 공백 등 문자를 포함하여 총 13개의 문자

있는 것을 알 수 있습니다. strlen의 결과는 13입니다.

 

C언어 문자열 복사 : strcpy

문자열을 복사하는 함수인 strcpy의 사용법에 대해서도 알아보겠습니다.

사용 방법은 strcpy(붙여넣은 문자열, 복사할 문자열)로 지정해주면 됩니다.

 

이 때, 붙여넣을 문자열에 기존 값이 있어도 무관하며,

복사할 문자열과 붙여넣을 문자열의 배열 크기가 달라도 상관 없습니다.

(다만, 붙여넣을 문자열 배열 크기가 복사할 문자열보다 작으면 안됩니다.)

 

예시 코드를 살펴보겠습니다.

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

int main(){

char str_a[10] = "abcdefgh";
char str_b[15] = "abc";

// 문자열 복사 (str_b <- str_a)
strcpy(str_b, str_a);

printf("%s\n", str_a);
printf("%s\n", str_b);

}

strcpy(str_b, str_a)로 썼으니, str_b에 str_a의 값을 복사하여 가져온다

라는 의미가 됩니다. 이 두 문자열의 출력 결과는 모두 어떻게 될까요?

 

정답은 두 문자열 모두 'abcdefgh'로 출력됩니다.

 

만일, str_b의 크기가 충분하지 않다면, 복사가 제대로 되지 않는 것에 주의해주세요.

여기서는 받을 문자열이 8글자이기에 9이상은 되어야 합니다.(null 문자 포함)

반응형

C언어 문자열 이어 붙이기 : strcat

strcat 함수도 사용 방법은 간단합니다.

strcat(str_a, str_b) 형식으로 사용하게 되면,

str_a에는 str_a + str_b 가 모두 이어 붙은 결과가 반환되고,

str_b는 그대로 남게 됩니다.

 

파이썬을 아시는 분이라면 string 덧셈 연산을 생각하시면 쉽습니다.

 

strcpy처럼 str_a 자리에는 이어 붙은 결과가 모두 반환될 수 있는

충분한 크기의 배열이 선언된 상태여야만 합니다.

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

int main(){

char str_a[15] = "abcd";
char str_b[15] = "efgh";

// 문자열 이어 붙이기 (str_a <- str_a + str_b)
strcat(str_a, str_b);

printf("%s\n", str_a); // abcdefgh
printf("%s\n", str_b); // efgh

}

str_a 자리에는 "abcd" + "efgh"의 결과인 "abcdefgh"가 반환되었고,

str_b는 그대로 "efgh"로 남은 것을 확인할 수 있었습니다.

 

위와 마찬가지로 str_a에 선언된 배열의 크기는 8글자 + 1(null)인

9칸 이상이 배정된 상태여야 정상적으로 strcat 함수가 수행됩니다.

 

C언어 문자열 비교하기 : strcmp

마지막으로 문자열의 대소를 비교할 수 있는 strcmp 함수를 보겠습니다.

 

문자열의 비교 원리는 첫 글자부터 비교하되, ASCII 코드의 값을 기준으로

다른 글자가 나오면, ASCII 코드의 값이 더 큰 쪽이 큰 것으로 판정합니다.

(글자 수가 짧아도 대소 비교에서 클 수 있습니다.)

 

다음 이미지에서 몇 가지 대소 비교 예시를 살펴보겠습니다.

첫 글자부터 ASCII 코드에 해당하는 값을 비교하며 다른 글자가 나오면

비교를 중단하는 모습을 살펴볼 수 있습니다.

('a'는 ASCII 값 97, 'b'는 98, 'c'는 99, ... 를 가집니다.)

 

참고로, null의 ASCII값은 0으로 배정되어, 중간까지 비교하다가

한 쪽이 null이 나오면 무조건 해당 문자열이 작은 것으로 판정됩니다.

 

strcmp 함수의 사용법은 strcmp(str_a, str_b)로 넣어서,

str_a > str_b이면 양수,

str_a == str_b이면 0(모든 문자가 동일한 경우),

str_a < str_b이면 음수가 반환됩니다.

 

예시 코드를 살펴보겠습니다.

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

int main(){

char str_a[5] = "bbb";
char str_b[5] = "abcd";
char str_c[5] = "abcf";
char str_d[5] = "bbbd";

int a, b, c, d;
// 문자열 대소 비교(왼쪽이 크면 양수, 오른쪽이 크면 음수, 같으면 0)
a = strcmp(str_a, str_b); // bbb > abcd : +1
b = strcmp(str_b, str_c); // abcd < abcf : -2
c = strcmp(str_a, str_d); // bbb\0 < bbbd : -100
d = strcmp(str_a, str_a); // bbb == bbb : 0

printf("%d\n%d\n%d\n%d\n", a, b, c, d);

}

실제 반환되는 값은 아스키코드 값의 차이가 반환되기는 하나,

이는 참고만 하시고, 실제로는 반환 값의 부호를 사용하신다고 보시면 됩니다.

 

이 외에도 string.h 라이브러리에서 지원하는 C언어 문자열 함수는 더 많지만,

여기서는 이 정도까지만 살펴보는 것으로 포스팅을 마무리하겠습니다.