C언어 초급 - 8장: 배열과 문자열 (8.3 문자열 (char 배열))

2025. 2. 23. 19:13프로그래밍 언어/C

8.3 문자열 (char 배열)

C 언어에서 문자열(String)문자의 배열(char 배열) 로 표현됩니다.
문자열을 저장할 때 문자 배열의 끝에는 반드시 \0(널 문자, null character)가 포함되어야 함을 이해하는 것이 중요합니다.
문자열을 다루기 위해 gets(), puts(), fgets() 같은 입출력 함수와, strlen(), strcpy(), strcmp(), strcat() 등의 문자열 처리 함수를 사용할 수 있습니다.


1. 문자열의 개념과 \0의 역할

1.1 문자열이란?

  • C 언어에서 문자열은 문자들의 배열입니다.
  • 문자열의 끝을 나타내기 위해 널 문자(\0)가 자동으로 추가됨.

1.2 문자열 선언 방법

char str1[] = "Hello";       // 자동으로 '\0' 추가됨
char str2[6] = "Hello";      // 크기를 명시하면 마지막은 '\0' 포함해야 함
char str3[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 수동으로 '\0' 추가
char str4[5] = "Hello";      // 오류 (널 문자 포함 시 최소 6칸 필요)

📌 문자열 끝에는 반드시 \0(널 문자)이 있어야 함!
📌 널 문자가 없으면 문자열이 끝나는 위치를 알 수 없음.


2. 문자열 입출력 (gets(), puts(), fgets())

C에서는 문자열을 입력받고 출력하기 위해 여러 함수를 사용할 수 있습니다.

2.1 gets() 함수 (사용 지양)

  • 한 줄의 문자열을 입력받을 수 있는 함수.
  • 공백(space)도 포함하여 입력 가능하지만 버퍼 오버플로우 문제가 있어 사용 지양.
#include <stdio.h>

int main() {
    char name[20];

    printf("이름을 입력하세요: ");
    gets(name);  // 공백 포함 문자열 입력 가능 (비추천)

    printf("입력된 이름: ");
    puts(name);  // 문자열 출력

    return 0;
}

실행 예시

이름을 입력하세요: Alice Wonderland
입력된 이름: Alice Wonderland

📌 문제점: gets()는 입력 버퍼를 초과할 경우, 메모리 오류가 발생할 수 있음 → 사용 지양.


2.2 puts() 함수

  • 문자열을 출력하는 함수.
  • 자동으로 개행(\n)을 추가함.
#include <stdio.h>

int main() {
    char greeting[] = "Hello, World!";

    puts(greeting);  // 자동 개행 포함

    return 0;
}

출력 결과

Hello, World!

📌 printf("%s\n", greeting); 과 동일한 기능을 수행하지만 puts()는 개행이 자동 추가됨.


2.3 fgets() 함수 (추천)

  • 버퍼 크기를 지정할 수 있어 보안상 안전한 문자열 입력 함수.
  • 자동으로 \n이 포함됨.
#include <stdio.h>

int main() {
    char name[20];

    printf("이름을 입력하세요: ");
    fgets(name, sizeof(name), stdin);  // 안전한 문자열 입력

    printf("입력된 이름: ");
    puts(name);  // 자동 개행 포함 출력

    return 0;
}

실행 예시

이름을 입력하세요: Alice Wonderland
입력된 이름: Alice Wonderland

📌 fgets()는 gets()와 달리 버퍼 크기를 지정하여 오버플로우를 방지할 수 있음 → 추천!
📌 자동으로 \n이 포함되므로 개행을 제거하려면 name[strlen(name) - 1] = '\0'; 사용.


3. 문자열 관련 함수

C 언어에서는 문자열 처리를 위한 다양한 표준 라이브러리 함수를 제공하며, 이들은 <string.h> 헤더 파일을 포함하여 사용해야 합니다.

#include <string.h>

3.1 strlen() – 문자열 길이 구하기

문자열의 길이를 반환하는 함수 (\0 제외).

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

int main() {
    char str[] = "Hello";

    printf("문자열 길이: %lu\n", strlen(str));  // 5 반환

    return 0;
}

출력 결과

문자열 길이: 5

📌 strlen()은 \0(널 문자)을 제외한 문자열의 길이를 반환.


3.2 strcpy() – 문자열 복사

  • 한 문자열을 다른 문자열로 복사.
  • 복사할 대상(dest)의 크기가 충분한지 확인해야 함.
#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello";
    char destination[10];

    strcpy(destination, source);  // 문자열 복사

    printf("복사된 문자열: %s\n", destination);

    return 0;
}

출력 결과

복사된 문자열: Hello

📌 destination 크기가 충분하지 않으면 메모리 오류 발생 가능 → strncpy()(최대 길이 지정) 사용 추천.


3.3 strcmp() – 문자열 비교

  • 두 문자열이 동일한지 비교 (0이면 동일).
  • 대소문자 구별 ("Hello" ≠ "hello").
#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello";
    char str2[] = "hello";

    if (strcmp(str1, str2) == 0) {
        printf("두 문자열이 같습니다.\n");
    } else {
        printf("두 문자열이 다릅니다.\n");
    }

    return 0;
}

출력 결과

두 문자열이 다릅니다.

📌 비교 결과

  • 0 → 두 문자열이 동일
  • 양수(>0) → str1이 str2보다 큼
  • 음수(<0) → str1이 str2보다 작음

3.4 strcat() – 문자열 연결 (Concatenation)

  • 두 문자열을 연결하여 하나로 만듦.
#include <stdio.h>
#include <string.h>

int main() {
    char str1[20] = "Hello";
    char str2[] = " World";

    strcat(str1, str2);  // str1에 str2를 이어붙임

    printf("연결된 문자열: %s\n", str1);

    return 0;
}

출력 결과

연결된 문자열: Hello World

📌 str1의 크기가 충분하지 않으면 메모리 오류 발생 가능 → strncat()(최대 길이 지정) 사용 추천.


4. 정리

함수 설명  사용 예제
strlen() 문자열 길이 반환 (\0 제외) strlen("Hello") → 5
strcpy() 문자열 복사 strcpy(dest, src);
strcmp() 문자열 비교 (같으면 0) strcmp("abc", "abc") == 0
strcat() 문자열 연결 strcat(str1, str2);
fgets() 안전한 문자열 입력 fgets(str, size, stdin);

📌 문자열은 char 배열이며, 끝에 \0이 포함됨
📌 문자열 조작 함수는 string.h를 포함해야 함
📌 gets()는 보안상 위험 → fgets() 사용 추천