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언어 문자열 함수는 더 많지만,
여기서는 이 정도까지만 살펴보는 것으로 포스팅을 마무리하겠습니다.
'C & C++' 카테고리의 다른 글
C언어 for문 케이스 정리 : 사용 방법, continue/break, 이중 for문 (0) | 2021.12.14 |
---|---|
C언어 논리 연산자, 비트 연산자 차이 비교, 사용 예시 (0) | 2021.12.08 |
[C언어] 배열(Array) 구조 선언, 할당, 포인터 연산, 출력 예제 (0) | 2021.12.07 |