반응형

c언어 동적할당 - 문자열 - 문자열 합치기/이어붙이기, 문자열 자르기

 

[C언어 #63] 동적할당 - 문자열 생성

[C언어 #64] 동적할당 - 문자열 - 길이, 문자 반환, 문자 입력

 

 

문자열 합치기 / 이어붙이기

// 문자열 합치기/이어붙이기
void stringAppend(char *c1, char *c2) {
    int newLength = stringLength(c1);
    for (int i = 0; c2[i] != '\0'; i++) c1[newLength++= c2[i];
    c1[newLength] = '\0';
}
 
// 새로운 문자열을 위한 메모리 재할당
void append(text *t1, text *t2) {
    int newLen = stringLength(t1->content) + stringLength(t2->content);
    while (t1->capacity < newLen + 1) t1->capacity *= 2;
    t1->content = realloc(t1->content, t1->capacity);
    stringAppend(t1->content, t2->content);
}
cs

 

 

문자열 자르기

// 문자열 자르기
text *slice(text *t, int i, int j) {
    int n = j - i;
    char new[n + 1];
    for (int k = 0; k < n; k++new[k] = t->content[i + k];
    new[n] = '\0';
    return newText(new);
}
 

 

 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.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;
}
 
void freeText(text *t) {
    free(t->content);
    free(t);
}
 
void stringAppend(char *c1, char *c2) {
    int newLength = stringLength(c1);
    for (int i = 0; c2[i] != '\0'; i++) c1[newLength++= c2[i];
    c1[newLength] = '\0';
}
 
void append(text *t1, text *t2) {
    int newLen = stringLength(t1->content) + stringLength(t2->content);
    while (t1->capacity < newLen + 1) t1->capacity *= 2;
    t1->content = realloc(t1->content, t1->capacity);
    stringAppend(t1->content, t2->content);
}
 
text *slice(text *t, int i, int j) {
    int n = j - i;
    char new[n + 1];
    for (int k = 0; k < n; k++new[k] = t->content[i + k];
    new[n] = '\0';
    return newText(new);
}
 
int main() {
 
    // 문자열 합치기, 이어붙이기
    text *t1 = newText("apple");
    text *t2 = newText(" ");
    text *t3 = newText("pie");
    append(t1, t2);
    printf("%s\n", t1->content);
    append(t1, t3);
    printf("%s\n", t1->content);
 
    freeText(t1);
    freeText(t2);
    freeText(t3);
 
    // 문자열 자르기
    text *= newText("apple pie");
    t1 = slice(t, 03);
    printf("0-3: %s\n", t1->content);
    t2 = slice(t, 05);
    printf("0-5: %s\n", t2->content);
    t3 = slice(t, 59);
    printf("5-9: %s\n", t3->content);
 
    freeText(t);
    freeText(t1);
    freeText(t2);
    freeText(t3);
 
    return 0;
}
 

 

 

 

반응형