[C] 배열

배열의 선언과 사용

배열의 선언

자료형 배열명[요소개수]

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

 

배열 초기화

배열은 선언과 동시에 {}로 붂어서 초기화한다.

  1. 기본적인 초기화 방법: int ary[5] = {1,2,3,4,5};
  2. 초깃값이 배열 요소의 개수보다 적은 경우(남은 배열 요소는 모두 0으로 채워짐): int ary[5] = {1,2,3};
  3. 자동 초기화 기능 사용(모든 요소를 0으로 초기화): int ary[1000] = {0};
  4. 배열 요소 개수 생략(초깃값 개수만큼 배열 요소 개수를 정하고 저장 공간 할당함): int ary[] = {1,2,3};
  5. 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형 배열 초기화하는 방법

  1. 문자 상수로 하나씩 초기화(쉽지 않음): char str[80] = {'a', 'p', 'p', 'l', 'e'};
  2. 문자열 상수로 한 번에 초기화: 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...