C++ 초급 - 6. 배열과 문자열 (4 - C-스타일 문자열 (char str[]))

2025. 2. 22. 13:38프로그래밍 언어/C++

📌 6.4 C-스타일 문자열 (char str[])

C-스타일 문자열(C-style String)char 배열을 사용하여 문자열을 저장하는 방식이다.
C언어에서 사용되던 문자열 처리 방식으로, 문자 배열(char str[])을 활용하여 문자열을 저장한다.
C++에서는 std::string이 제공되지만, 저수준 문자열 처리나 기존 C 코드와의 호환성을 위해 C-스타일 문자열이 여전히 사용됨.

C-스타일 문자열은 문자 배열과 종료 문자(\0)로 구성되며,
문자열 조작을 위해 <cstring> 헤더의 여러 문자열 처리 함수를 활용한다.


📌 1. C-스타일 문자열 선언 및 초기화

🔹 (1) C-스타일 문자열 선언

💡 기본 문법

char 문자열이름[문자열길이] = "문자열";

💡 예제: C-스타일 문자열 선언 및 초기화

#include <iostream>

int main() {
    char str1[] = "Hello";  // 자동으로 '\0' 포함됨
    char str2[6] = "World"; // '\0' 포함 (길이는 +1)
    char str3[6] = {'H', 'e', 'l', 'l', 'o', '\0'};  // 명시적 초기화

    std::cout << "str1: " << str1 << std::endl;
    std::cout << "str2: " << str2 << std::endl;
    std::cout << "str3: " << str3 << std::endl;

    return 0;
}

🔹 출력 결과

str1: Hello
str2: World
str3: Hello

💡 설명

  • char str1[] = "Hello"; → 자동으로 \0(널 문자)가 포함됨.
  • char str2[6] = "World"; → 길이를 직접 명시(최소 문자 개수 + 1 필요).
  • char str3[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; → 직접 초기화.

주의

  • char str[5] = "Hello"; → 메모리 초과 오류 발생 가능 (널 문자 포함 필요).
  • char str[5] = {'H', 'e', 'l', 'l', 'o'}; → 널 문자 누락 시, 출력 오류 발생 가능.

📌 2. 문자열 입력 및 출력 (cin, cout, gets 등)

C-스타일 문자열을 입력받을 때는 cin 또는 gets를 사용할 수 있다.

🔹 (1) cin을 이용한 문자열 입력

  • cin은 공백 이전까지만 입력을 받음.

💡 예제: cin으로 문자열 입력 받기

#include <iostream>

int main() {
    char name[20];
    
    std::cout << "이름을 입력하세요: ";
    std::cin >> name;  // 공백 이전까지만 입력됨

    std::cout << "입력한 이름: " << name << std::endl;
    return 0;
}

🔹 입력 예시

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

💡 설명

  • "Alice Wonderland"을 입력하면 "Alice"까지만 저장됨(공백 이후는 무시).

🔹 (2) cin.getline()을 이용한 문자열 입력

  • cin.getline()을 사용하면 공백 포함 문자열 입력 가능.

💡 예제: cin.getline()으로 문자열 입력 받기

#include <iostream>

int main() {
    char sentence[50];

    std::cout << "문장을 입력하세요: ";
    std::cin.ignore();  // 이전 입력 버퍼 지우기
    std::cin.getline(sentence, 50);  // 최대 49개 문자 입력 (마지막은 '\0')

    std::cout << "입력한 문장: " << sentence << std::endl;
    return 0;
}

🔹 입력 예시

문장을 입력하세요: Hello World!
입력한 문장: Hello World!

💡 설명

  • cin.getline(sentence, 50); → 최대 49개 문자 입력 가능('\0' 포함).

📌 3. strlen, strcpy, strcmp 등의 문자열 처리 함수

C-스타일 문자열은 <cstring> 헤더의 다양한 함수를 사용하여 조작할 수 있다.

🔹 (1) strlen() – 문자열 길이 반환

💡 예제: strlen() 사용

#include <iostream>
#include <cstring>  // 문자열 처리 함수 포함

int main() {
    char str[] = "Hello, World!";
    std::cout << "문자열 길이: " << strlen(str) << std::endl;  // 13 (널 문자 제외)
    return 0;
}

🔹 출력 결과

문자열 길이: 13

🔹 (2) strcpy() – 문자열 복사

💡 예제: strcpy() 사용

#include <iostream>
#include <cstring>

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

    strcpy(destination, source);  // destination에 source 복사

    std::cout << "복사된 문자열: " << destination << std::endl;
    return 0;
}

🔹 출력 결과

복사된 문자열: C++

주의

  • destination 크기가 충분하지 않으면 오버플로우 위험.

🔹 (3) strcmp() – 문자열 비교

💡 예제: strcmp() 사용

#include <iostream>
#include <cstring>

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    if (strcmp(str1, str2) == 0) {
        std::cout << "두 문자열이 같습니다." << std::endl;
    } else {
        std::cout << "두 문자열이 다릅니다." << std::endl;
    }

    return 0;
}

🔹 출력 결과

두 문자열이 다릅니다.

💡 설명

  • strcmp()는 동일하면 0, str1이 작으면 -1, 크면 1 반환.

📌 4. C-스타일 문자열과 std::string의 차이점

C++에서는 std::string을 사용하면 더 안전하고 편리하게 문자열을 다룰 수 있다.

비교 항목 C-스타일 문자열 (char str[]) std::string
메모리 관리 수동(new[], delete[] 필요) 자동 메모리 관리
크기 조절 고정 크기 (char str[100];) 크기 자동 증가 (str += "text";)
안전성 오버플로우 가능 안전한 사용 (at(), length())
기능성 strcpy(), strcmp() 필요 .append(), .compare() 등 제공

💡 예제: std::string을 사용한 문자열 처리

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    str += " World!";  // 문자열 추가

    std::cout << "문자열 길이: " << str.length() << std::endl;
    std::cout << "전체 문자열: " << str << std::endl;

    return 0;
}

🔹 출력 결과

문자열 길이: 12
전체 문자열: Hello World!

📌 5. 정리

개념  설명
문자열 선언 char str[10] = "Hello";
문자열 입력 cin.getline(str, 50);
문자열 길이 strlen(str);
문자열 복사 strcpy(dest, src);
문자열 비교 strcmp(str1, str2);
C++ 표준 문자열 사용 std::string을 활용하여 더 안전하게 문자열 처리 가능