C/Chapter09. 문자열

lullaby ·2025년 10월 1일

C언어

목록 보기
9/10
post-thumbnail

1. 문자와 문자열의 차이점

  • 문자: 하나의 문자 ('A', '\n') - 단일 인용부호 사용
  • 문자열: 연속된 문자들의 모임 ("hello") - 이중 인용부호 사용
  • 널 종료 문자열: 문자열 끝에 널 문자(\0) 저장

2. 문자 배열 선언 및 초기화

char str1[10] = "abc";        // 크기 10, "abc" + 널 문자
char str2[] = "hello";        // 크기 자동 할당 (6개)
char str3[10] = "";           // 모든 원소를 널 문자로 초기화

⚠️ 중요 포인트:

  • 배열 크기 = 문자열 길이 + 1 (널 문자 포함)
  • 초기화 시 문자열이 배열보다 길면 오류 발생

3. 표준 C 문자열 처리 함수 (<string.h>)

함수기능사용법
strlen()문자열 길이 (널 문자 제외)int len = strlen(str);
strcpy()문자열 복사strcpy(dest, src);
strcmp()문자열 비교int result = strcmp(s1, s2);
strcat()문자열 연결strcat(dest, src);
strchr()문자 검색char* p = strchr(str, 'c');
strstr()문자열 검색char* p = strstr(str, "sub");
strtok()토큰 분리char* token = strtok(str, "-");



업로드중..

4. 문자열 포인터

char* p = "hello";           // 문자열 리터럴을 가리킴 (읽기 전용)
const char* cp = "world";    // 읽기 전용 포인터 (권장)
char str[] = "test";
char* p2 = str;              // 수정 가능한 문자 배열을 가리킴

5. 2차원 문자 배열 vs 문자열 포인터 배열

// 2차원 문자 배열 (수정 가능)
char books[3][20] = {"book1", "book2", "book3"};

// 문자열 포인터 배열 (읽기 전용)
const char* menu[] = {"File", "Edit", "View"};

🔥 시험 출제 포인트

1. 버퍼 오버런 문제

  • strcpy(), strcat() 함수의 안전성 문제
  • _CRT_SECURE_NO_WARNINGS 매크로 사용법
  • 안전한 함수: strcpy_s(), strcat_s()

2. 문자열 비교

// ❌ 잘못된 방법
if (str1 == str2)  // 주소 비교

// ✅ 올바른 방법
if (strcmp(str1, str2) == 0)  // 내용 비교

3. strtok() 함수 사용법//외워!!!!!!!!!!!

char str[] = "010-123-4567";
char* token = strtok(str, "-");  // 첫 번째 토큰
while (token != NULL) {
    printf("%s\n", token);
    token = strtok(NULL, "-");   // 다음 토큰
}

📝 예상 문제 & 해답

문제 1: 기본 개념 (객관식)

다음 중 올바른 문자 배열 선언은?

  1. char str[5] = "hello";
  2. char str[6] = "hello";
  3. char str[] = "hello";
  4. 2번과 3번 모두

정답: 4번

  • "hello"는 5글자 + 널 문자 = 6바이트 필요
  • 3번은 자동으로 크기 6으로 할당됨

문제 2: 코드 분석 (주관식)

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

int main(void) {
    char str1[10] = "abc";
    char str2[10] = "xyz";
    char temp[10];

    strcpy(temp, str1);
    strcpy(str1, str2);
    strcpy(str2, temp);

    printf("str1: %s, str2: %s\n", str1, str2);
    return 0;
}

출력 결과는?

정답: str1: xyz, str2: abc

  • 두 문자열을 교환하는 코드

문제 3: 문자열 길이 (주관식)

char str[] = "Hello\nWorld";
int len = strlen(str);

변수 len의 값은?

정답: 11

  • \n은 하나의 문자로 취급
  • 널 문자는 길이에 포함되지 않음

문제 4: 포인터와 배열 (주관식)

char str[] = "programming";
char* p = str + 3;
printf("%c\n", *p);
printf("%s\n", p);

출력 결과는?

정답:

g
gramming

문제 5: 문자열 검색 (코딩)

다음 함수를 완성하시오. 문자열에서 특정 문자의 개수를 세는 함수이다.

int count_char(const char* str, char ch) {
    int count = 0;
    // 여기를 완성하시오
    return count;
}

정답:

int count_char(const char* str, char ch) {
    int count = 0;
    while (*str != '\0') {
        if (*str == ch)
            count++;
        str++;
    }
    return count;
}

문제 6: strtok 활용 (코딩)

이메일 주소 "user@domain.com"에서 사용자명과 도메인을 분리하는 코드를 작성하시오.

정답:

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

int main(void) {
    char email[] = "user@domain.com";
    char* user = strtok(email, "@");
    char* domain = strtok(NULL, "@");

    printf("사용자명: %s\n", user);
    printf("도메인: %s\n", domain);
    return 0;
}

🎯 실전 대비 체크리스트

✅ 암기해야 할 것들

  • 주요 문자열 함수들의 반환 타입과 매개변수
  • strcmp() 함수의 반환값 (0: 같음, 양수: 첫 번째가 큰 경우, 음수: 두 번째가 큰 경우)
  • 문자 상수 vs 문자열 상수 표기법
  • 포인터 산술 연산 규칙

✅ 실수하기 쉬운 부분

  • 문자열 비교 시 == 대신 strcmp() 사용
  • 배열 크기 계산 시 널 문자 고려
  • strtok() 사용 후 원본 문자열 변경됨 주의
  • 문자열 리터럴은 수정 불가능

✅ 코딩 문제 대비

  • 문자열 뒤집기 함수 작성
  • 회문(palindrome) 검사 함수
  • 문자열에서 공백 제거 함수
  • 문자열 분할 및 조합 문제

🔧 디버깅 팁

  1. 세그멘테이션 오류 방지
    • 배열 경계 확인
    • 널 포인터 체크
    • 문자열 끝 널 문자 확인
  2. 메모리 관리
    • 동적 할당된 문자열의 해제
    • 스택 오버플로우 방지
  3. 컴파일러 경고 주의
    • 문자열 관련 보안 경고
    • 타입 불일치 경고

📖 마지막 점검 문제

종합 문제: 단어 카운터 프로그램

사용자로부터 문장을 입력받아 단어의 개수를 세는 프로그램을 작성하시오.
(단어는 공백으로 구분됨)

해답:

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

int count_words(const char* sentence) {
    int count = 0;
    int in_word = 0;

    while (*sentence) {
        if (isspace(*sentence)) {
            in_word = 0;
        } else if (!in_word) {
            in_word = 1;
            count++;
        }
        sentence++;
    }
    return count;
}

int main(void) {
    char sentence[100];
    printf("문장을 입력하세요: ");
    fgets(sentence, sizeof(sentence), stdin);

    printf("단어 개수: %d\n", count_words(sentence));
    return 0;
}

0개의 댓글