C 언어 string.h
IT 위키
더 많은 작업
문자열과 메모리 블록을 복사·연결·비교·검색하는 함수들을 선언한 C 언어의 표준 헤더
- C 언어의 문자열은 별도 자료형이 아니라 널 문자(
'\0')로 끝나는 char 배열이다. string.h 의 문자열 함수는 모두 이 널 문자를 기준으로 길이를 판단한다. - 대상 배열의 크기를 검사하지 않으므로, 결과가 들어갈 공간은 호출하는 쪽이 확보해야 한다 → 버퍼 오버플로우
#include <string.h>
| 함수 | 하는 일 | 반환값 |
|---|---|---|
| strlen(s) | 널 문자를 빼고 센 문자 수 | 길이(size_t) |
| strcpy(dest, src) | src 를 널 문자까지 dest 에 덮어써서 복사 | dest |
| strncpy(dest, src, n) | 최대 n 문자 복사. src 가 n 이상이면 널 문자가 붙지 않는다 | dest |
| strcat(dest, src) | dest 의 널 문자 자리부터 src 를 이어 붙인다 | dest |
| strncat(dest, src, n) | 최대 n 문자를 이어 붙이고 널 문자를 붙인다 | dest |
| strcmp(a, b) | 사전 순 비교 | 같으면 0, a 가 앞이면 음수, 뒤면 양수 |
| strncmp(a, b, n) | 앞 n 문자만 비교 | strcmp 와 같다 |
| strchr(s, c) / strrchr(s, c) | 문자 c 가 처음 / 마지막으로 나오는 위치 | 포인터, 없으면 NULL |
| strstr(s, t) | 부분 문자열 t 가 처음 나오는 위치 | 포인터, 없으면 NULL |
| strtok(s, delim) | 구분자로 문자열을 잘라 토큰을 하나씩 돌려준다 | 포인터 |
| 함수 | 하는 일 |
|---|---|
| memcpy(dest, src, n) | n 바이트 복사. 두 영역이 겹치면 결과가 정의되지 않는다 |
| memmove(dest, src, n) | n 바이트 복사. 영역이 겹쳐도 안전하다 |
| memset(p, c, n) | n 바이트를 값 c 로 채운다. 배열 초기화에 쓴다 |
| memcmp(a, b, n) | n 바이트 비교 |
배열 원소를 포인터로 바꾼 뒤 strcat 으로 잇는 예다.
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[20] = "KOREA";
char str2[20] = "LOVE";
char *p1 = str1;
char *p2 = str2;
str1[1] = p2[2]; /* 'O' → 'V' : str1 = "KVREA" */
str2[3] = p1[4]; /* 'E' → 'A' : str2 = "LOVA" */
strcat(str1, str2); /* str1 = "KVREALOVA" */
printf("%c\n", *(p1 + 2)); /* R */
printf("%s %d\n", str1, (int)strlen(str1)); /* KVREALOVA 9 */
return 0;
}
p1은str1의 첫 원소를 가리키므로p1[4]와str1[4]는 같은 칸이다 → C 언어 포인터- strcat 은
str1에 이어 붙이므로str1의 앞부분은 그대로다.*(p1 + 2)는 세 번째 문자 'R' 이다. str1이char str1[20]이라 9문자와 널 문자가 들어갈 자리가 있다. 크기가 모자라면 strcat 은 배열 밖을 덮어쓴다.
strlen("KOREA")는 5다. 널 문자를 포함한 배열 크기(sizeof)는 6이다.- 문자열은
==로 비교하면 주소를 비교한다. 내용을 비교하려면 strcmp 를 쓴다. - 문자열을 대입할 때
str1 = str2;는 컴파일 오류다. 배열 이름은 대입할 수 없으므로 strcpy 를 쓴다.