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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
|
#include <stdio.h>
// Header, Library
#include <string.h>
//#define DEBUG_MODE
#define TRUE 1
#define FALSE 0
#define ERROR -1
// strlen, strcpy, strcmp, strcat
// String Length
int StrLen(const char* const _pStr);
// 얕은복사(Shallow Copy): 주소복사
// 깊은복사(Deep Copy): 값복사
// String Copy
// Dest: Destination
// Sour: Source
int StrCpy(char* const _pDest, const char* const _pSour);
// String Compare
int StrCmp(const char* const _pLhs,
const char* const _pRhs);
// String Concatenate
int StrCat(char* const _pDst,
const char* const _pSrc1,
const char* const _pSrc2);
void main()
{
// 문자열(String)
char c = 'c';
printf("c: %c (%d)\n", c, c);
// \0: 널 문자(Null Character)
char cStr[] = {
'H', 'e', 'l', 'l', 'o', ',', ' ',
'W', 'o', 'r', 'l', 'd', '!', '\0'
};
int cStrLen = sizeof(cStr) / sizeof(cStr[0]);
for (int i = 0; i < cStrLen; ++i)
printf("%c", cStr[i]);
printf("\n");
/////////////////////////////////////////
char* str = "Hello, World!";
// 문자열 상수
//str[1] = "E";
printf("str: %s\n", str);
// 문자열 변수
cStr[1] = 'E';
printf("cStr: %s\n", cStr);
char format[] = { 's', 't', 'r', ':', '%', 'd', '\n', '\0' };
printf(format, sizeof(str));
printf("cStr Length: %d\n", sizeof(cStr));
printf("\n");
////////////////////////////////////////////
int cnt = 0; // Count
//while (cStr[cnt] != '\0')
//{
// printf("cStr[%d]: %c\n", cnt, cStr[cnt]);
// ++cnt;
//}
//printf("cStr Length: %d\n", cnt);
printf("cStr Length: %d\n", StrLen(cStr));
//cnt = 0;
//while (str[cnt] != '\0') ++cnt;
//printf("str Length: %d\n", cnt);
printf("str Length: %d\n", StrLen(str));
StrLen(NULL);
printf("\n");
// Buffer: Buf, Buff
char copyBuf[32];
StrCpy(copyBuf, cStr);
copyBuf[1] = 'a';
printf("copyBuf: %s\n", copyBuf);
printf("cStr: %s\n", cStr);
printf("\n");
if (StrCmp(cStr, str) == TRUE)
printf("cStr == str: TRUE\n");
else
printf("cStr == str: FALSE\n");
printf("abc == abc: %s\n",
StrCmp("abc", "abc") == TRUE ? "TRUE" : "FALSE");
printf("\n");
char catBuf[32] = { 0 };
StrCat(catBuf, "Hello, ", "World!");
printf("catBuf: %s\n", catBuf);
}
int StrLen(const char* const _pStr)
{
//_pStr = "Bomb!";
//char* bomb = "Bomb!";
//_pStr = bomb;
//_pStr[1] = '!';
// 예외처리(Exception)
// NULL Exception
if (_pStr == NULL)
{
#ifdef _DEBUG
printf("File: %s\n", __FILE__);
printf("Line: %d\n", __LINE__);
#endif
printf("ERROR] _pStr is NULL\n");
return -1;
}
// TODO: 널 문자가 없는 문자열
int cnt = 0;
while (_pStr[cnt] != '\0')
{
// Debug Mode
// 조건부 컴파일(Conditional Compile)
#ifdef DEBUG_MODE
printf("_pStr[%d]: %c\n", cnt, _pStr[cnt]);
#endif
++cnt;
}
return cnt;
}
int StrCpy(char* const _pDest, const char* const _pSour)
{
if (_pDest == NULL || _pSour == NULL) return -1;
int i = 0;
while (_pSour[i] != '\0')
{
_pDest[i] = _pSour[i];
++i;
}
_pDest[i] = _pSour[i];
return 0;
}
// 같으면 1, 다르면 0, 문제가 있다 -1
int StrCmp(const char* const _pLhs,
const char* const _pRhs)
{
if (_pLhs == NULL || _pRhs == NULL) return ERROR;
int lhsLen = StrLen(_pLhs);
int rhsLen = StrLen(_pRhs);
if (lhsLen != rhsLen) return FALSE;
for (int i = 0; i < lhsLen; ++i)
{
if (_pLhs[i] != _pRhs[i])
return FALSE;
}
return TRUE;
}
int StrCat(char* const _pDst,
const char* const _pSrc1,
const char* const _pSrc2)
{
if (_pDst == NULL ||
_pSrc1 == NULL ||
_pSrc2 == NULL)
return ERROR;
int i = 0;
while (*(_pSrc1 + i) != '\0')
{
*(_pDst + i) = *(_pSrc1 + i);
++i;
}
int src1Len = StrLen(_pSrc1);
while (*(_pSrc2 + i - src1Len) != '\0')
{
*(_pDst + i) = *(_pSrc2 + i - src1Len);
++i;
}
*(_pDst + i) = '\0';
return TRUE;
}
|
cs |
이번 글은 문자열 (string)에 대해 글을 쓰겠습니다.
- StrLen함수: 문자열 길이에 대한 함수
- StrCpy함수: 문자열을 특정한 곳에 복사하는 함수
- StrCmp함수: 문자열 비교하는 함수
- StrCat함수: 문자열을 이어붙여주는 함수
이번 글에는 const를 이용한 상수화가 사용되었습니다. 각 기능에 따라 필요한 곳에 배치됩니다. 자료형 앞에 붙으면 주소값을 상수화하고 변수명의 앞에 붙으면 값을 상수화시킵니다. 중요도에 따라 const를 붙인다고 생각하면 편합니다.
- StrLen함수는 문자열 길이를 구하는 함수입니다. 문자열이란 주소와 값이 바뀌지 않아야하므로 매개변수에 const를 자료형과 변수명 앞에 모두 붙입니다. int StrLen(const char* const _pStr)
- StrCpy함수는 문자열을 특정한 곳에 복사하는 함수로 복사할 곳, 복사하려는 두 개의 매개변수가 필요합니다. const는 붙는 곳이 다른데 복사할 곳은 주소만 바뀌지 않아야하므로 char앞에 const, 복사하려는 매개변수는 주소와 값 모두 중요하기 때문에 둘 다 const를 붙입니다. int StrCpy(char* const _pDest, const char* const _pSour)
- StrCmp함수는 문자열을 비교하는 함수입니다. 비교하려면 최소 두 가지 이상의 매개변수를 가지고 있어야합니다. 그리고 둘은 주소, 값 모두 중요하기 때문에 const를 모두 붙여줍니다. int StrCmp(const char* const _pLhs, const char* const _pRhs)
- StrCat함수는 문자열을 이어붙여주는 함수입니다. 이어붙여진 결과에 대한 매개변수와 붙일 두 개의 매개변수가 필요합니다. 결과 매개변수는 주소보단 받아들여진 결과값이 바뀌지 않아야하므로 값 앞에만 const를 붙이고, 붙을 매개 변수 두 개는 주소와 값 모두 중요하기 때문에 const를 다 붙여줍니다.
int StrCat(char* const _pDst, const char* const _pSrc1, const char* const _pSrc2)
이후는 각 함수에 NULL예외처리를 하고난 후, 필요한 조건문을 작성하여 반복을 돌리는 함수를 만들고 그걸 호출하여 출력하면 됩니다.
끝
'프로그래밍 C언어' 카테고리의 다른 글
비트 단위 연산자 (Bitwise Operators) (0) | 2024.08.18 |
---|---|
동적 메모리 할당 (Dynamic Memory Allocate) (0) | 2024.08.18 |
함수 (Function) (0) | 2024.08.14 |
포인터 (pointer) (0) | 2024.08.13 |
배열 (Array) (0) | 2024.08.12 |