반응형

c언어 동적할당 - 문자열 - string.h 활용

 

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

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

[C언어 #65] 동적할당 - 문자열 - 합치기/이어붙이기, 자르기

[C언어 #66] 동적할당 - 문자열 - 비교, 포함여부 판단

 

 

문자열 생성 - strlen, strcpy 활용

// strlen, strcpy 활용
text *newText(char *s) {
    text *= malloc(sizeof(text));
    t->capacity = 24;
    while (strlen(s) + 1 > t->capacity) t->capacity *= 2;
    t->content = malloc(t->capacity);
    strcpy(t->content, s);
    return t;
}
 

 

 

문자열 길이 - strlen

int stringLength(text *t) {
    return strlen(t->content);
}
 

 

 

문자열 비교 - strcmp

int stringCompare(text *t1, text *t2) {
    return strcmp(t1->content, t2->content);
}
 

 

 

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

void stringAppend(text *t1, text *t2) {
    int newLen = strlen(t1->content) + strlen(t2->content) + 1;
    while (newLen > t1->capacity) t1->capacity *= 2;
    t1->content = realloc(t1->content, t1->capacity);
    strcat(t1->content, t2->content);
}
 

 

 

문자열 포함여부 - strstr

int stringFind(text *t, text *p) {
    char *= strstr(t->content, p->content);
    return (f == NULL)? -1 : f - t->content;
}
 

 

 

동적할당 - 문자열 - string.h 활용

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
 
struct text {
    int capacity;
    char *content;
};
 
typedef struct text text;
 
text *newText(char *s) {
    text *= malloc(sizeof(text));
    t->capacity = 24;
    while (strlen(s) + 1 > t->capacity) t->capacity *= 2;
    t->content = malloc(t->capacity);
    strcpy(t->content, s);
    return t;
}
 
void freeText(text *t) {
    free(t->content);
    free(t);
}
 
int stringLength(text *t) {
    return strlen(t->content);
}
 
int stringCompare(text *t1, text *t2) {
    return strcmp(t1->content, t2->content);
}
 
void stringAppend(text *t1, text *t2) {
    int newLen = strlen(t1->content) + strlen(t2->content) + 1;
    while (newLen > t1->capacity) t1->capacity *= 2;
    t1->content = realloc(t1->content, t1->capacity);
    strcat(t1->content, t2->content);
}
 
int stringFind(text *t, text *p) {
    char *= strstr(t->content, p->content);
    return (f == NULL)? -1 : f - t->content;
}
 
int main() {
 
    // text 구조체 생성
    text *= newText("Hello World!");
 
    // 문자열 길이
    int len = stringLength(t);
    if (len == 12printf("length of '%s': %d\n", t->content, len);
    freeText(t);
 
    // 문자열 합치기, 이어붙이기
    text *t1 = newText("apple");
    text *t2 = newText(" ");
    text *t3 = newText("pie");
    stringAppend(t1, t2);
    printf("%s\n", t1->content);
    stringAppend(t1, t3);
    printf("%s\n", t1->content);
    freeText(t1);
    freeText(t2);
    freeText(t3);
 
    // 문자열 비교
    t1 = newText("abcd");
    t2 = newText("abcd");
    t3 = newText("abcc");
    text *t4 = newText("abce");
    if (stringCompare(t1, t2) == 0printf("%s == %s\n", t1->content, t2->content);
    if (stringCompare(t1, t3) > 0printf("%s > %s\n", t1->content, t3->content);
    if (stringCompare(t1, t4) < 0printf("%s < %s\n", t1->content, t4->content);    
    freeText(t1);
    freeText(t2);
    freeText(t3);
    freeText(t4);
 
    // 문자열 포함 여부 확인
    t = newText("apple pie");
    t1 = newText("apple");
    t2 = newText("app");
    t3 = newText("pie");
 
    t4 = newText("play");
    text *t5 = newText("pic");
 
    if (stringFind(t, t1) == 0printf("yes\n");
    if (stringFind(t, t2) == 0printf("yes\n");
    if (stringFind(t, t3) == 6printf("yes\n");
 
    if (stringFind(t, t4) == -1printf("no\n");
    if (stringFind(t, t5) == -1printf("no\n");
 
    freeText(t);
    freeText(t1);
    freeText(t2);
    freeText(t3);
    freeText(t4);
    freeText(t5);
 
    return 0;
}

 

 

반응형