주간 | 진도 | 기본 숙제(필수) | 추가 숙제(선택) |
5주차 (8/5~8/11) |
Ch.08 | 배열의 개념 정리 | 널 문자의 정의,용도,표기법 정리 |
유튜브 강의: 혼자 공부하는 C언어
혼자 공부하는 C 언어
[혼자 공부하는 C 언어]는 [이것이 C언어다]의 전면 개정판으로, 두 책의 독자 모두 이 강의를 참고하여 학습하실 수 있습니다. [혼자 공부하는 C 언어]는 [이것이 C언어다] 콘텐츠를 기반으로 기획
www.youtube.com
Ch.08 배열
1. 배열의 선언과 사용
배열이란? 같은 형태의 많은 데이터를 반복문으로 처리하기 위해 메모리에 연속적으로 저장하고 쪼개 사용하는 방법.
- 배열의 선언: int형 변수처럼 하나씩 지정하는 방식이 아닌 하나의 이름으로 지정. (저장공간의 개수와 상관없이 하나)
8-1 5명의 나이를 저장할 배열을 선언하고 사용하는 방법
#include <stdio.h>
int main(void)
{
int ary[5]; // int형 요소 5개의 배열 선언
ary[0] = 10; // 첫 번째 배열 요소에 10 대입
ary[1] = 20;
ary[2] = ary[0] + ary[1];
scanf("%d", &ary[3]); // 키보드로 입력받아 네번째 요소에 저장
printf("%d\n", ary[2]);
printf("%d\n", ary[3]);
printf("%d\n", ary[4]); // 5번째 배열 요소를 지정하지 않았기에 garbage value 출력
return 0;
}
- 배열 요소
- 배열의 나눠진 조각
- 변수와 똑같이 사용됨.
- 배열 요소는 배열명에 index을 붙여 사용 (index는 0부터 시작)
ary[0] | ary[1] | ary[2] |
4 bytes | 4 bytes | 4 bytes |
10 | 20 | 30 |
- 배열의 사용
- 배열을 선언할 때int ary[5];
:배열 요소의 개수(5개) - 배열 요소를 사용할 때ary[0] = 10;
:배열에서의 위치(맨 앞) - 배열의 인덱스가 사용 범위를 벗어난 경우결과 예측 불가능.
컴파일러가 경고 메세지로 알려주기도 하지만 배열 요소에 포인터 연산을 통해 접근
>> 실행은 가능
사용 범위를 준수해야 함.
- 배열을 선언할 때int ary[5];
- 배열의 초기화 : 최초 할당된 메모리엔 쓰레기 값이 있기에 원하는 값을 위해선 초기화를 해야함.( {}를 사용)
- 기본적인 초기화 방법
int ary1[5] = {1,2,3,4,5};
: 초깃값은 첫 번째 요소부터 차례로 초기화됨. - 초깃값이 배열 요소보다 적은 경우
int ary2[5] = {1,2,3};
: 초깃값부터 초기화하되 남은 요소는 0으로 채움. - 자동 초기화 기능
int ary[1000] = {0};
: 배열 요소의 개수와 상관없이 모두 0으로 초기화 - 배열 요소 개수가 생략된 경우
int ary[] = {1,2,3};
: 컴파일러가 초깃값 개수만큼 배열 요소를 정하고 저장 공간 할당함. - double형 배열과 char형 배열을 선언하고 초기화
각각의 자료형에 맞게 초기화됨.
double ary[5] = { 1.0, 2.1, 3.2, 4.3, 5.4 };
char ary[5] = { 'a','p','p','l','e' };
- 기본적인 초기화 방법
- 배열과 반복문
// 예제 8-2
#include <stdio.h>
int main(void)
{
int score[5]; // 다섯 과목의 성적을 입력할 int형 배열 선언
int i; // 반복 제어 변수
int total = 0; // 총점을 누적할 변수
double avg; // 평균을 저장할 변수
for (i = 0; i < 5; i++)
{
scanf("%d", &score[i]);
}
for (i = 0; i < 5; i++)
{
total += score[i]; // 성적을 누적하여 총점 계산
}
avg = total / 5.0;
for (i = 0; i < 5; i++)
{
printf("%5d", score[i]); // 성적 출력
}
printf("\n");
printf("평균 : %.1lf\n", avg); // 평균 출력
return 0;
}
- sizeof 연산자를 활용한 배열 처리
- sizeof(배열명) / sizeof(배열 요소)
:배열 요소의 개수를 구하는 방법으로, 배열 요소의 개수가 필요한 모든 곳에서 사용 가능.
- sizeof(배열명) / sizeof(배열 요소)
2. 문자를 저장하는 배열
- char형 배열의 선언과 초기화
- 저장할 문자열의 길이보다 최소 한개 이상 크게 배열을 선언해야 함.
: 널 문자(\0)를 저장하기 위해
- 저장할 문자열의 길이보다 최소 한개 이상 크게 배열을 선언해야 함.
// 예제 8-4
#include <stdio.h>
int main(void)
{
char str[80] = "applejam"; // 문자열 초기화
printf("최초 문자열 : %s\n", str); // 초기화 문자열 출력
printf("문자열 입력 : ");
scanf("%s", str); // 새로운 문자열 입력
printf("입력 후 문자열 : %s\n", str); //입력된 문자열 입력
return 0;
}
// 실행결과
최초 문자열 : applejam
문자열 입력 : HelloWorld
입력된 문자열 : HelloWorld
- 문자 상수로 하나씩 초기화
char str[80] = { 'a','p','p','l','e','j','a','m' }; - 문장열 상수로 한 번에 초기화
char str[80] = "applejam";
# 널 문자 : 문자열의 끝을 표시하는 용도
- printf 함수
: char형 배열에서 널 문자가 나올 때까지만 출력. 즉 널 문자가 없을 시 원하지 않는 데이터 출력 위험 존재 - scanf 함수
: 사용자가 입력한 문자열의 끝에 자동으로 널 문자를 추가해 printf가 정상적으로 동작하게 함. - 초기화되지 않은 배열의 문제점
- char형 배열을 선언하고 초기화하지 않은 상태에서 배열 요소에 문자를 입력할 경우, 배열의 끝에 널 문자가 자동으로 추가되지 않음. 따라서 문자열의 끝을 표시하려면 반드시 마지막 문자 다음에 널 문자를 직접 입력해야 함.
- char형 배열을 선언하고 초기화하지 않은 상태에서 배열 요소에 문자를 입력할 경우, 배열의 끝에 널 문자가 자동으로 추가되지 않음. 따라서 문자열의 끝을 표시하려면 반드시 마지막 문자 다음에 널 문자를 직접 입력해야 함.
- char형 배열 선언 시 주의점
1. 배열의 크기는 최대한 넉넉하게 선언하기.
2. 배열 요소의 개수는 최소 '문자열 길이' 보다 + 1
- 문자열 대입
- 일반 변수처럼 대입 연사자는 사용 불가능
> strcpy(저장될 배열명, 저장할 문자열); 함수 사용
:char형 배열에 새로운 문자열을 저장하는 함수
:저장할 문자열의 길이를 파악하고 길이만큼 char형 배열에 문자열을 복사함.(문자열 끝 널 문자도 자동으로 붙여줌.) - 배열에서 대입 연산자를 사용할 수 없는 이유배열 이름이 상수 포인터로서 배열의 시작 주소를 나타내기 때문이며,따라서 strcpy 같은 함수를 사용해 배열의 내용을 복사해야 함.
- 일반 변수처럼 대입 연사자는 사용 불가능
- 문자열 전용 입출력 함수: gets, puts
- 키보드로 문자열을 입력할 경우.
gets : 빈칸을 포함해 한 줄 전체를 문자열로 입력
puts : 함수와 짝을 이루는 문자열 출력 함수
- 키보드로 문자열을 입력할 경우.
// 예제 8-6
#include <stdio.h>
int main(void)
{
char str[80];
printf("문자열 입력 : "); // 입력 안내 메세지 출력
gets(str); // 빈칸을 포함한 문자열 입력
puts("입력된 문자열 : "); // 문자열 상수 출력
puts(str); // 배열에 저장된 문자열 출력
return 0;
}
// 실행결과
문자열 입력: HelloWolrd
입력된 문자열:
HelloWorld
- gets 함수
: 문자열 입력 중간에 빈칸이나 탭(tab) 문자 사용 가능.
: 엔터를 누르기 전까지 전체를 하나의 배열에 저장함.
: 입력할 때 항상 배열의 크기를 고려해야 함. - puts 함수
: gets 함수와 함께 짝을 이뤄 문자열을 출력함.
: 문자열 상수나 char형 배열의 배열명을 주면 문자열의 화면에 출력함.
: 문자열을 출력한 후에 자동으로 줄 바꿈.
'혼공C' 카테고리의 다른 글
[혼공C] 6주차 Ch.09 (0) | 2024.08.19 |
---|---|
[혼공C] 4주차 Ch.07 (0) | 2024.07.30 |
[혼공C] 3주차 Ch.05~Ch.06 (4) | 2024.07.23 |
[혼공C] 2주차 Ch.03~Ch.04 (2) | 2024.07.15 |
[혼공C] 1주차 Ch.01~Ch.02 (0) | 2024.07.07 |