반응형

c언어 동적할당 - 문자열 (문자배열 character array)

 

문자배열(문자열)을 동적으로 할당한 텍스트(text) 구조체를 저장

필요한 함수: 텍스트 구조체 생성; 문자열 길이; 문자열 복사; 메모리해제 함수

 

 

구조체 선언

// 문자 배열을 동적으로 할당한 텍스트 구조체 저장
struct text {
    int capacity;
    char *string;
};
 
// 텍스트 구조체
typedef struct text text;
 

 

 

복사한 문자열을 가지고 있는 텍스트(text) 구조체 생성

// 복사한 문자열을 가지고 있는 새로운 텍스트 구조체 생성
text *newText(char *str) {
 
    // 구조체 메모리 할당
    text *= malloc(sizeof(text));
 
    // 기본 문자열 메모리 설정
    t->capacity = 24;
 
    // null counter를 고려한 문자열의 길이에 따라 메모리를 할당
    while (t->capacity < stringLength(str) + 1) t->capacity *= 2;
 
    // 기본 문자열 메모리 할당
    t->content = malloc(t->capacity);
 
    // 복사한 문자열을 text 구조체에 저장
    stringCopy(t->content, str);
 
    return t;
}
 

 

 

문자열 길이

// 문자열 길이 반환
int stringLength(char *str) {
    int len = 0;
    for (int i = 0; str[i] != '\0'; i++) len++;
    printf("Length of string '%s': %d\n", str, len);
    return len;
}
 

 

 

문자열 복사

// str2 문자열을 str1에 복사
void stringCopy(char *str1, char *str2) {
    int len = stringLength(str2);
    for (int i = 0; i < len; i++) str1[i] = str2[i];
    str1[len] = '\0';
    printf("newString: %s\n", str1);
}
 

 

 

메모리 해제

// 메모리 해제
void freeText(text *t) {
    free(t->content);
    free(t);
}
 

 

 

문자열 동적 할당

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
 
struct text {
    int capacity;
    char *content;
};
 
typedef struct text text;
 
int stringLength(char *str) {
    int len = 0;
    for (int i = 0; str[i] != '\0'; i++) len++;
    return len;
}
 
void stringCopy(char *str1, char *str2) {
    int len = stringLength(str2);
    for (int i = 0; i < len; i++) str1[i] = str2[i];
    str1[len] = '\0';
}
 
text *newText(char *str) {
    text *= malloc(sizeof(text));
    t->capacity = 24;
    while(stringLength(str) + 1 > t->capacity) t->capacity *= 2;
    t->content = malloc(t->capacity);
    stringCopy(t->content, str);
    return t;
}
 
int main() {
    text *= newText("Hello World!");
    printf("%s\n", t->content);
    free(t);
 
    return 0;
}

 

 

 

반응형