Menu
Coddy logo textTech

동적 문자열 빌더

Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 59번째.

challenge icon

챌린지

쉬움

StringBuilder를 만들어 봅시다. 텍스트를 append할 때 자동으로 크기가 늘어나는 dynamic 문자열 컨테이너입니다. 이는 이 과정 전체에서 익힌 dynamic 메모리 관리와 OOP 패턴을 결합한 실용적인 유틸리티입니다.

코드를 세 개의 파일로 구성합니다:

  • stringbuilder.h: 세 개의 멤버를 가진 StringBuilder 구조체를 Declare합니다. 멤버는 char* buffer, current length를 위한 size_t, 전체 capacity를 위한 size_t입니다. StringBuilder를 생성하고, 여기에 텍스트를 append하고, 최종 문자열을 가져오고, 메모리를 해제하는 함수 프로토타입을 Declare합니다. Include guard는 필수입니다.
  • stringbuilder.c: StringBuilder 시스템을 Implement합니다.
    • create_stringbuilder: heap에 StringBuilder를 할당하고, buffer를 초기 capacity인 16 bytes로 초기화하며, length를 0으로 설정하고, buffer가 empty string(null-terminated)으로 시작하도록 합니다.
    • append: StringBuilder 포인터와 append할 문자열을 받습니다. 새로 필요한 length를 Calculate합니다. capacity를 exceeds하면 capacity를 double합니다(필요한 경우 반복해서). 그리고 realloc을 사용해 buffer를 grow합니다. 그런 다음 strcat을 사용해 새 텍스트를 concatenate합니다.
    • get_string: internal buffer를 가리키는 포인터를 반환합니다(read-only access).
    • free_stringbuilder: 먼저 buffer를 free한 다음 StringBuilder 구조체 자체를 free합니다.
  • main.c: append할 문자열의 개수를 나타내는 정수를 읽습니다. 그런 다음 fgets를 사용해 각 문자열을 읽고 StringBuilder에 append합니다. all 문자열이 추가되면 get_string을 사용해 complete assembled 문자열을 출력합니다. 마지막으로 StringBuilder를 free합니다.

이 challenge에서 사용되는 두 가지 핵심 함수:

  • realloc(ptr, new_size): 이전에 할당된 메모리 블록의 크기를 조정합니다. 기존 블록을 가리키는 포인터와 bytes 단위의 새 desired size를 받아, 크기가 조정된 블록(이동되었을 수도 있음)을 가리키는 포인터를 반환합니다. buffer를 grow해야 할 때 append에서 사용합니다:
    sb->buffer = (char*)realloc(sb->buffer, sb->capacity);
  • fgets(buffer, size, stream): input stream에서 텍스트 한 줄을 character array로 읽습니다. newline에서 멈추거나 size - 1개의 문자를 읽으면 멈춥니다. newline character를 buffer에 유지하므로 직접 제거해야 합니다. main.c에서 각 input string을 읽을 때 사용합니다:
    fgets(line, sizeof(line), stdin);
    끝의 newline을 제거하려면 마지막 character가 '\n'인지 확인하고 '\0'으로 바꿉니다.

프로그램에는 다음이 입력됩니다:

  1. append할 문자열의 개수
  2. 각 줄에 하나씩 입력되는 문자열

입력이 3이고, 이어서 Hello, , World일 때의 예시 출력:

Hello World

입력이 4이고, 이어서 C, is, a, great language!일 때의 예시 출력:

C is a great language!

입력이 1이고, 이어서 SingleString일 때의 예시 출력:

SingleString

각 append 작업 후 length field를 업데이트해야 한다는 점을 기억하세요. 재할당이 필요한지 확인할 때 null terminator를 고려해야 합니다. buffer에는 length + new_text_length + 1 bytes를 저장할 공간이 필요합니다. 문자열 length를 측정하려면 <string.h>strlen을 사용하세요. 또한 main.c에서 scanf 다음에 getchar()를 호출해, fgets로 문자열을 읽기 전에 남아 있는 newline을 consume해야 합니다.

직접 해보기

#include <stdio.h>
#include <stdlib.h>
#include "stringbuilder.h"

int main() {
    int n;
    scanf("%d", &n);
    getchar(); // 숫자 뒤의 개행 문자를 소비
    
    // TODO: Create a StringBuilder using create_stringbuilder()
    
    // TODO: Read n strings and append each to the StringBuilder
    // 힌트: 각 줄을 읽으려면 fgets 또는 유사한 함수를 사용하세요
    // fgets를 사용하는 경우 개행 문자를 처리하는 것을 기억하세요
    
    // TODO: get_string()을 사용하여 완성된 조립 문자열을 출력하세요
    
    // TODO: Free the StringBuilder using free_stringbuilder()
    
    return 0;
}

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C 컴파일러