[혼공C] 5주차 Ch.08

Junsu Park ㅣ 2024. 8. 13. 03:56

[혼공 C] 5주차

주간 진도 기본 숙제(필수) 추가 숙제(선택)
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 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(배열 요소)
      :배열 요소의 개수를 구하는 방법으로, 배열 요소의 개수가 필요한 모든 곳에서 사용 가능.

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형 배열 선언 시 주의점
    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