본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

문자열과 메모리 블록을 복사·연결·비교·검색하는 함수들을 선언한 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 를 쓴다.