C언어가 기본적으로 제공하는 라이브러리 중 'string.h' 헤더파일에는 문자열 관련 유용한 함수들이 정의되어 있습니다.
1. 문자열 길이 반환 : strlen
strlen 함수는 전달인자로 받은 문자열의 시작부터 null문자 이전까지의 길이를 반환합니다. 즉, null문자는 길이정보에 포함시키지 않습니다.
#include <stdio.h>
#include <string.h>
int main(void)
{
int n;
char * ptr = "Hello";
n = strlen("Hello"); //strlen이 반환하는 문자열의 길이를 변수 n에 저장
printf("%d\n", n); //n 출력
printf("%d\n", strlen("Hello")); //strlen함수가 반환하는 문자열길이 출력
printf("%d\n", strlen(ptr)); //strlen함수가 반환하는 ptr이 가르키는 문자열 길이 출력
return 0;
}
실행결과
5
5
5
계속하려면 아무 키나 누르십시오 . . .
우리가 예상한것처럼 각각 5,6이 나왔습니다. 이는 null문자가 제외된 문자열의 길이입니다.
2. 문자열 복사 : strcpy / strncpy
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[15] = "ABCDEFGHIJ";
char str2[15];
strcpy(str2, str1);
printf("%s\n", str2);
return 0;
}
실행결과
`ABCDEFGHIJ
계속하려면 아무 키나 누르십시오 . . .
strcpy는 전달인자 2개 중에서 앞에오는 곳에 뒤에오는 곳의 문자열을 그대로 복사해서 가져다줍니다. 물론 NULL문자까지 포함하여 복사됩니다.
strncpy도 strcpy와 비슷한데, 전달인자가 2개가 아닌 3개입니다. 마지막 하나는 복사할 배열의 길이를 지정해주는 전달인자입니다.
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[15] = "ABCDEFGHIJ";
char str2[15];
strncpy(str2, str1,sizeof(str2));
printf("%s\n", str2);
return 0;
}
실행결과
`ABCDEFGHIJ
계속하려면 아무 키나 누르십시오 . . .
하지만 다음과 같은 경우를 주의해야합니다.
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[15] = "ABCDEFGHIJKLM"; //13 + NULL문자 = 14개의 문자
char str2[10];
strncpy(str2, str1,sizeof(str2));
printf("%s\n", str2);
return 0;
}
위의 코드를 실행하였을 때 str2에 str1의 문자 중 10개만 전달되는 건 분명합니다. 그럼 실행결과를 먼저 보시죠.
실행결과
`ABCDEFGHIJ儆儆儆儆儆ABCDEFGHIJKLM
계속하려면 아무 키나 누르십시오 . . .
이해할 수 없는 문자열이 출력됩니다. 그 이유는 str2에는 NULL문자가 포함되어있지 않기 때문입니다.
그래서 항상 우리는 복사된 문자열이 전달이 될 포인터나 배열에 항상 null문자까지 고려하여 전달할 문자열의 길이를 설정해야 합니다. 위의 경우에는 다음과 같이 코드를 수정하면 되겠습니다.
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[15] = "ABCDEFGHIJKLM";
char str2[10];
strncpy(str2, str1,sizeof(str2)-1); //str2의 길이보다 1만큼 작은 문자열의 길이만 복사
str2[sizeof(str2)-1] = NULL; //str2의 마지막 index 칸에 NULL문자 추가
printf("%s\n", str2);
return 0;
}
실행결과
`ABCDEFGHI
계속하려면 아무 키나 누르십시오 . . .
3. 문자열 덧붙이기 : strcat / strncat
strcat 함수와 strncat 함수는 아래와 같이 사용됩니다.
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[20] = "ABCD";
char str2[20] = "EFGH";
char str3[20] = "ABCD";
char str4[20] = "EFGH";
strcat(str1, str2);//str1 뒤에 str2를 이어붙임
puts(str1); //str1 출력
strncat(str3, str4, 2); //str3뒤에 str4를 2개만 이어붙임
puts(str3);
return 0;
}
strncat함수는 strcat함수와 달리 이어붙일 문자열의 갯수를 지정하는 전달인자가 추가됩니다.
실행결과
`ABCDEFGH
ABCDEF
계속하려면 아무 키나 누르십시오 . . .
이 때 NULL 문자의 위치는 자동으로 조정됩니다.
4. 문자열 비교 : strcmp, strncmp
이 두 함수는 두 개의 문자열의 내용이 같은지 다른지 비교해줍니다. 하나씩 비교하다가 다른 문자를 만났을 때 str1의 문자 ASCII코드 값이 크면 양수를, str2의 문자 ASCII코드값이 크면 음수를 반환합니다. 두 문자열이 같으면 0을 반환합니다.
strncmp가 strcmp와 다른점은 비교 할 문자열의 갯수를 지정할 수 있다는 것 뿐입니다.
#include <stdio.h>
#include <string.h>
int main(void)
{
char * str1 = "ABCE";
char * str2 = "ABCDE";
char * str3 = "ABCDE";
printf("%d\n", strcmp(str1, str2)); // C까진 동일하나 str1의 E가 str2의 D보다 ASCII코드값 크므로 양수 반환
printf("%d\n", strcmp(str2, str1)); // C까진 동일하나 str2의 D가 str1의 E보다 ASCII코드값 작으므로 음수 반환
printf("%d\n", strcmp(str2, str3)); // 동일한 문자열이므로 0 반환
printf("%d\n", strncmp(str1, str2, 3)); // 3번째 문자까지는 같으므로 0 반환
return 0;
}
실행결과
`1
-1
0
0
계속하려면 아무 키나 누르십시오 . . .
'프로그래밍 언어 > C' 카테고리의 다른 글
(C언어) 38 - 구조체(1) (0) | 2020.05.14 |
---|---|
(C언어) 37 - 버퍼(Buffer) (0) | 2020.05.14 |
(C언어) 35 - 문자열 입출력 함수들 (0) | 2020.05.14 |
(C언어) 34 - 문자 입출력 함수들 (0) | 2020.05.14 |
(C언어) 33 - 스트림 (0) | 2020.05.14 |