Skip to content

Commit 7a007e7

Browse files
committed
8.3 까지 공부
1 parent 874f887 commit 7a007e7

File tree

7 files changed

+198
-1
lines changed

7 files changed

+198
-1
lines changed

Chap08-Array/Chap08-Array.md

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,5 +120,87 @@ int main(void){
120120
121121
122122
123-
## 8.2 최대값/최소값
123+
## 8.2 문자열의 배열
124124
125+
**문자열은 본래 `char` 형 배열이다.** 그리고 **문자열의 끝은 `\0`(NULL 문자)** 이다.
126+
127+
128+
129+
### 8.3.1 문자열의 기본 구조
130+
131+
다음 예제는 문자열의 본질이 배열임을 설명하는 코드이다.
132+
133+
```c
134+
// arraystring01.c
135+
#include <stdio.h>
136+
137+
int main(void){
138+
139+
// 배열 각 요소의 값을 하나씩 기술하는 방식으로 초기화
140+
int aList[5] = { 30, 40, 10, 50, 20 };
141+
char szBuffer[6] = { 'H', 'e', 'l', 'l', 'o', '\0' };
142+
143+
// 문자열 형태로 문자집합을 기술하는 방식으로 배열 초기화
144+
char szData[8] = { "Hello" };
145+
146+
// 문자열 상수를 가리키는 포인터 변수 선언 및 초기화
147+
char *pszBuffer = "Hello";
148+
149+
// 문자열은 모두 같은 방식으로 출력
150+
puts(szBuffer);
151+
puts(szData);
152+
puts(pszBuffer);
153+
154+
return 0;
155+
}
156+
/* 출력결과
157+
Hello
158+
Hello
159+
Hello
160+
*/
161+
```
162+
163+
아래의 그림은 위의 코드에서 문자열 배열의 논리적 메모리 구조를 나타낸 것이다.
164+
165+
![](./images/string.png)
166+
167+
168+
169+
원래 `"Hello"`라는 문자열을 풀어서 표시하면, `'H', 'e', 'l', 'l', 'o', '\0'`이다. 문자상수 하나하나를 일일이 표기하려면 매우 번거롭기 때문에 보통은 문자열(`"Hello"`)로 표기한다.
170+
171+
172+
173+
### 8.3.2 문자열의 끝이 `'\0'`인 이유
174+
175+
[독하게 시작하는 C 프로그래밍]의 저자이신 최호성님의 전적인 사견임을 책에서도 밝혀 놓았듯이 명확한 정답은 있는 듯 하진 않지만, 공부하는 입장인 나로써는 충분히 일리가 있는 설명인듯하다.
176+
177+
다음 예제는 사용자로부터 영문이름을 입력받아 문자열의 길이를 출력하는 코드이다.
178+
179+
```c
180+
// arraystring02.c
181+
#include <stdio.h>
182+
183+
int main(void){
184+
185+
char szBuffer[32] = { 0 };
186+
int nLength = 0;
187+
188+
// 이름을 입력받아 배열에 저장한다.
189+
printf("Input your name : ");
190+
gets(szBuffer);
191+
192+
// 배열의 시작부터 '\0'가 나올 때까지 계속 다음으로 넘기고 확인한다.
193+
while(szBuffer[nLength] != '\0')
194+
nLength++;
195+
196+
// 이름과 문자열의 길이를 출력한다.
197+
printf("Your name is %s(%d).\n", szBuffer, nLength);
198+
return 0;
199+
}
200+
/*출력결과
201+
Input your name : cjh
202+
Your name is cjh(3).
203+
*/
204+
```
205+
206+
위의 코드에서 만약에 문자열 안에 `'\0'` 이 들어있지 않다면 무한루프가 발생할 수 있다. 하지만, 문자열의 끝에는 항상(?) `'\0'`이 들어 있으므로 위의 코드는 에러없이 동작한다.

Chap08-Array/arraystring01.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// arraystring01.c
2+
#include <stdio.h>
3+
4+
int main(void){
5+
6+
// 배열 각 요소의 값을 하나씩 기술하는 방식으로 초기화
7+
int aList[5] = { 30, 40, 10, 50, 20 };
8+
char szBuffer[6] = { 'H', 'e', 'l', 'l', 'o', '\0' };
9+
10+
// 문자열 형태로 문자집합을 기술하는 방식으로 배열 초기화
11+
char szData[8] = { "Hello" };
12+
13+
// 문자열 상수를 가리키는 포인터 변수 선언 및 초기화
14+
char *pszBuffer = "Hello";
15+
16+
// 문자열은 모두 같은 방식으로 출력
17+
puts(szBuffer);
18+
puts(szData);
19+
puts(pszBuffer);
20+
21+
return 0;
22+
}

Chap08-Array/arraystring02.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// arraystring02.c
2+
#include <stdio.h>
3+
4+
int main(void){
5+
6+
char szBuffer[32] = { 0 };
7+
int nLength = 0;
8+
9+
// 이름을 입력받아 배열에 저장한다.
10+
printf("Input your name : ");
11+
gets(szBuffer);
12+
13+
// 배열의 시작부터 '\0'가 나올 때까지 계속 다음으로 넘기고 확인한다.
14+
while(szBuffer[nLength] != '\0')
15+
nLength++;
16+
17+
// 이름과 문자열의 길이를 출력한다.
18+
printf("Your name is %s(%d).\n", szBuffer, nLength);
19+
return 0;
20+
}

Chap08-Array/getmaxarray.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
8-1. 배열에서 최대값 구하기
3+
*/
4+
5+
#include <stdio.h>
6+
7+
int main(void){
8+
9+
int aList[5] = { 30, 40, 10, 50, 20 };
10+
int i = 0;
11+
12+
// 여기에 코드 작성
13+
for(i = 1; i < 5; ++i)
14+
if(aList[0] < aList[i])
15+
aList[0] = aList[i];
16+
17+
// 이하 코드는 수정하지 않는다.
18+
for(i = 0; i < 5; ++i)
19+
printf("%d\t", aList[i]);
20+
putchar('\n');
21+
22+
printf("MAX: %d\n", aList[0]);
23+
return 0;
24+
}

Chap08-Array/getmin.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
8-2. 요소의 값을 교한하는 방식으로
3+
배열에서 최소값 구하기
4+
*/
5+
#include <stdio.h>
6+
7+
int main(void){
8+
9+
int aList[5] = { 30, 40, 10, 50, 20 };
10+
int i = 0, nTmp = 0;
11+
12+
// 여기에 들어갈 코드를 작성한다.
13+
for(i = 1; i < 5; ++i) {
14+
if (aList[0] > aList[i]) {
15+
nTmp = aList[0];
16+
aList[0] = aList[i];
17+
aList[i] = nTmp;
18+
}
19+
}
20+
21+
// 이하 코드는 수정하지 않는다.
22+
for(i = 0; i < 5; ++i)
23+
printf("%d\t", aList[i]);
24+
putchar('\n');
25+
26+
printf("MIN: %d\n", aList[0]);
27+
return 0;
28+
}

Chap08-Array/images/string.png

51.3 KB
Loading

Chap08-Array/maxfromarray01.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// maxfromarray01.c
2+
#include <stdio.h>
3+
4+
int main(void){
5+
6+
int aList[5] = { 30, 10, 40, 20, 50 };
7+
// 배열의 첫 번째 요소를 최대값으로 설정한다.
8+
int i = 0, nMax = aList[0];
9+
10+
// 이후 두 번째 요소부터 마지막 요소까지 비교한다.
11+
for(i = 0; i < 5; ++i)
12+
if(aList[i] > nMax)
13+
nMax = aList[i];
14+
15+
// 전체 요소 및 최대값을 출력한다.
16+
for(i = 0; i < 5; ++i)
17+
printf("%d\t", aList[i]);
18+
putchar('\n');
19+
printf("MAX: %d\n", nMax);
20+
return 0;
21+
}

0 commit comments

Comments
 (0)