배열의 선언과 사용
배열의 선언
자료형 배열명[요소개수]
e. int ary[5];
// 5명의 나이를 저장할 배열을 선언하고 사용하는 방법
#incude <stdio.h>
int main(void)
{
int ary[5]; // int형 요소 5애의 배열 선언
// ary는 array의 축약어
ary[0] = 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]); // 마지막 배열 요소는 쓰레기 값
return 0;
}
[실행 결과]
50 ↩
30
50
-858993460
배열 초기화
배열은 선언과 동시에 {}로 붂어서 초기화한다.
- 기본적인 초기화 방법: int ary[5] = {1,2,3,4,5};
- 초깃값이 배열 요소의 개수보다 적은 경우(남은 배열 요소는 모두 0으로 채워짐): int ary[5] = {1,2,3};
- 자동 초기화 기능 사용(모든 요소를 0으로 초기화): int ary[1000] = {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', 'b', 'c', 'd', 'e'};
배열을 선언할 때만 한 번에 배열을 초기화 할 수 있다. 이후에는 배열 요소에 일일이 값을 대입해야 한다.
배열과 반복문
배열과 반복문을 사용한 성적 처리 프로그램
#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++)
{
prinf("%5d", score[i]); // 성적 출력
}
printf("\n");
prinf("평균: %.1lf\n", avg); // 평균 출력
return 0;
}
sizeof 연산자를 활용한 배열 처리
배열 요소의 개수를 직접 계산해 반복문에 사용할 수 있다.
배열의 요소 개수는 다음과 같이 구한다: sizeof(배열명) / sizeof(배열 요소)
count = sizeof(score) / sizeof(score[0]);
// 배열의 평균을 구할 때는 소수점 이하 까지 구하기 위해서는 형 변환 연산자 사용해 실수 연산 만들어야 함
avg = total / (double) count;
문자를 저장하는 배열
char형 배열의 선언과 초기화
저장할 문자열의 길이보다 최소한 하나 이상 크게 배열을 선언해야한다 (예: apple -> 배열 요소 개수가 최소 6개 이상이어야 함). 그 이유는 널 문자(\n)을 저장하기 위해서이다.
char형 배열 초기화하는 방법
- 문자 상수로 하나씩 초기화(쉽지 않음): char str[80] = {'a', 'p', 'p', 'l', 'e'};
- 문자열 상수로 한 번에 초기화: char str[80] = "apple";
널 문자의 용도
- 널 문자(null character): 문자열 배열의 남는 배열 요소에는 자동으로 0이 채워진다. 이렇게 char형 배열에 저장된 0을 널문자라고 한다. (아스키 코드 값: 0 / 문자 상수: \0)
- 문자의 끝을 표시하는 용도
- scanf 함수는 사용자가 입력한 문자열 다음에 자동으로 널문자를 추가해 문자열의 끝을 표시
- char형 배열 선언 시 초기화하지 않은 경우 반드시 마지막 문자 다음에 널 문자 대입해야 함
char형 배열 선언 시 주의할 점
- 배열의 크기는 최대한 넉넉하게 선언해야 한다
- 배열 요소의 개수는 최소한 '문자열 길이+1'이어야 한다 (널 문자 저장 위해)
문자열 대입
strcpy 함수 : char형 배열에 새로운 문자열을 저장하는 함수. 저장할 문자열의 길이를 파악해 그 길이만큼 char형 배열에 문자열을 복사하며 끝에 널 문자도 자동으로 붙여준다.
+) 대입 연산자 왼쪽에 배열명이 올 수 없다.
// strcpy(저장할 배열명, 저장할 문자열);
strcpy(str1, "tiger");
strcpy(str2, str1); // str2 배열에 str1 배열의 문자열 복사
// 첫번째 인수에 문자열 상수 사용 불가:
// strcpy("lion", "tiger");
문자열 전용 입출력 함수: gets, puts
scanf 함수는 char형 배열에 문자열을 입력할 수 있지만 중간에 빈칸이 있는 경우 빈간 전까지만 입력한다.
gets 함수: 빈칸을 포함해 한 줄 전체를 문자열로 입력한다.
- gets(char형 배열명);
- 문자열 입력 중간에 빈칸이나 탭 문자 사용 가능. enter 누르기 전까지 전체를 하나의 문자열로 배열에 저장함. 마지막에 널 문자 자동으로 붙여줌
- 사용 시 주의점: 입력할 배열의 크기를 검사하지 않음 → 배열의 크기보다 긴 문열 입력 시 배열을 벗어난 메모리 영역을 침범할 수 있음 (scanf, strcpy도 마찬가지)
puts 함수: 문자열 상수나 char형 배열의 배열명을 주면 문자열을 화면에 출력해줌.
- printf 함수의 문자열 출력 기능과 같지만, 문자열을 출력한 후 자동으로 줄을 바꿔주는 차이 있음 ➡ 문자열을 출력한 후 바로 이어서 입력하는 것은 불가능해짐
prinf("문자열 입력 : "); // 입력 안내 메시지 출력
gets(str); // 빈칸을 포함한 문자열 입력
puts("입력된 문자열 : "); // 문자열 상수 출력
puts(str); // 배열에 저장된 문자열 출력
[실행결과]
문자열 입력 : Love is belif... ↩
입력된 문자열 :
Love is belif...
