7 장 . 배열과 문자열
1
#include <stdio.h>
int main(void) {
int num;
printf(“Please enter an integer: ");
scanf("%d", &num);
if ( num < 0 )
printf("Is negative.\n");
printf("num = %d\n", num);
return 0;
}
■ 배열이란 무엇인지 알아보고, 배열을 선언하고 사용하는 방법을 알아본다.
■ 배열이란 무엇인지 알아보고, 배열을 선언하고 사용하는 방법을 알아본다.
■ 배열을 초기화하는 방법을 알아본다.
■ 배열을 초기화하는 방법을 알아본다.
학습목표
배열
• 배열의 기본
• 다차원 배열
배열
• 배열의 기본
• 다차원 배열
문자열
• 문자 배열
• 문자열 처리 함수
• 문자열의 입출력
• 문자열 배열
문자열
• 문자 배열
• 문자열 처리 함수
• 문자열의 입출력
• 문자열 배열
7장. 배열과 문자열 3
5개의 정수를 입력 받으려면 5개의 정수형 변수를 선언해야 한 다.
배열의 기본
배열
배열
같은 데이터 형의 변수를 메모리에 연속적으로 할당하고 같은 이름으로 사용하는 방법을 제공
배열의 각 원소는 메모리에 연속적으로 할당된다.
7장. 배열과 함수
배열의 기본
5
배열의 선언(1/3)
배열을 선언하려면 배열의 데이터 형과 배열 명, 배열의 크기가 필요하다.
배열의 기본
배열
배열의 선언(2/3)
변수의 메모리 할당
배열의 크기는 반드시 0보다 큰 정수형 상수로 지정해야 한다.
7장. 배열과 함수
배열의 기본
7
배열의 선언(3/3)
배열의 크기는 리터럴 상수, 매크로 상수로 지정할 수 있다.
배열 전체의 바이트 크기를 배열 원소 하나의 바이트 크기로 나누면 배열 원소의 개수(배열의 크기)를 구할 수 있다.
배열의 기본
배열
배열의 사용(1/2)
배열의 각 원소에 접근하려면 첨자 또는 인덱스(index)를 이용한다.
배열의 인덱스는 항상 0부터 시작하고, 배열 크기보다 1 작은 값까지 사용할 수 있다.
7장. 배열과 함수
배열의 사용
9
배열의 선언 및 사용 예
배열의 사용
배열
int 배열의 선언 01: /* Ex07_01.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int arr[5];
배열의 사용(2/2)
배열 인덱스의 유효 범위는 0 ~ (배열의 크기 - 1) 사이의 값이다.
잘못된 인덱스를 사용하면 실행 에러가 발생할 수 있다.
7장. 배열과 함수
배열의 사용
11
잘못된 인덱스의 사용 예
배열의 사용
배열
잘못된 인덱스의 사용 01: /* Ex07_02.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int arr[5];
07: int i;
08:09: arr[0] = 10;
10: arr[1] = 20;
11: arr[2] = 30;
12: arr[3] = 40;
13: arr[4] = 50;
14: arr[5] = 60;
15:16: for(i = 0 ; i < 5 ; i++)
17: printf("arr[%d] = %d\n", i, arr[i]);
18:19: return 0;
20: }
14번째 줄에서 실행 에러
가 발생하므로 프로그램
이 정상적으로 수행되지
않는다!
배열의 초기화(1/4)
배열도 초기화를 하지 않으면 쓰레기 값을 갖는다.
배열도 초기화해서 사용하는 것이 좋다.
7장. 배열과 함수
배열의 초기화
13
배열의 초기화(2/4)
배열의 초기화
배열
배열의 초기화(3/4)
배열을 초기화할 때 초기값을 원소의 개수보다 부족하게 지정하면 나머지 원소를 0으로 초기화한다.
배열을 초기화하기 위해서 { }를 사용할 때는 반드시 초기값을 하나 이상 지정해 야 한다.
7장. 배열과 함수
배열의 초기화
15
배열의 초기화(4/4)
배열의 초기값을 지정할 때는 배열의 크기를 생략할 수 있다.
배열의 초기화
배열
정수형 배열의 합계와 평균 구하기(1/2)
7장. 배열과 함수
배열의 활용
17 배열의 크기로 사용될 매크로 상수
01: /* Ex07_04.c */
02: #include <stdio.h>
03:04: #define MAX 5 05:06: int main(void) 07: {
08: int arr[MAX] = { 0 };
09: int i;
10: int sum;
11: double average;
12:13: printf("%d개의 정수를 입력하세요 : ", MAX);
14: for(i = 0 ; i < MAX ; i++) 15: scanf("%d", &arr[i]);
16:17: for(i = 0, sum = 0 ; i < MAX ; i++)
18: sum += arr[i];
19:
int형 배열의 선언 및 초기화
배열의 입력
배열의 합계 구하기
정수형 배열의 합계와 평균 구하기(2/2)
배열의 활용
배열
20: average = (double)sum / (double)MAX;
21: printf("합계 : %d, 평균 : %5.2f\n", sum, average);
22:23: return 0;
24: }
배열의 평균 구하기
정수형 배열의 선택 정렬(1/2)
7장. 배열과 함수
배열의 활용
19 01: /* Ex07_05.c */
02: #include <stdio.h>
03:04: #define SIZE 10 05:06: int main(void) 07: {
08: int array[SIZE] = { 23, 96, 35, 42, 81, 19, 8, 77, 50, 64 };
09: int i, j, index;
10: int temp;
11:
int형 배열의 선언 및 초기화
정수형 배열의 선택 정렬(2/2)
배열의 활용
배열
12: for(i = 0; i < SIZE-1 ; i++)
13: {
14: index = i;
15: for(j = i+1 ; j < SIZE ; j++)
16: {
17: if( array[index] > array[j] )
18: index = j;
19: }
20: temp = array[i];
21: array[i] = array[index];
22: array[index] = temp;
23: }
24:25: printf("정렬 결과 : ");
26: for(i = 0 ; i < SIZE ; i++) 27: printf("%d ", array[i]);
28: printf("\n");
29:30: return 0;
31: }
선택 정렬
선택 정렬(insertion sort)
7장. 배열과 함수
배열의 활용
21
다차원 배열
배열의 원소에 접근하기 위해서 인덱스를 둘 이상 사용하는 경우를 말한다.
다차원 배열도 일차원 배열처럼 연속된 메모리에 할당된다.
다차원 배열
배열
이차원 배열의 선언
7장. 배열과 함수
다차원 배열
23
이차원 배열의 사용
이차원 배열의 원소에 접근할 때 인덱스를 두 개 사용한다.
인덱스의 개수가 배열의 차수를 결정한다.
다차원 배열
배열
이차원 배열의 선언 및 사용 예(1/2)
7장. 배열과 함수
다차원 배열
25 01: /* Ex07_06.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: short data[2][3];
07: int i, j;
08:09: data[0][0] = 1;
10: data[0][1] = 2;
11: data[0][2] = 3;
12: data[1][0] = 4;
13: data[1][1] = 5;
14: data[1][2] = 6;
15:
이차원 배열의 사용 이차원 배열의 선언
이차원 배열의 선언 및 사용 예(2/2)
다차원 배열
배열
16: for(i = 0; i < 2 ; i++)
17: {
18: for(j = 0 ; j < 3 ; j++)
19: {
20: printf("%d ", data[i][j]); 이차원 배열의 사용
이차원 배열의 초기화(1/2)
일차원 배열처럼 { }를 이용한다. 초기값을 이차원 배열의 제2크기 개수만큼씩 { } 로 묶어서 다시 { } 안에 나열한다.
일차원 배열처럼 { } 안에 초기값만 나열할 수도 있다.
초기값을 생략하면 나머지 원소를 0으로 초기화한다.
7장. 배열과 함수
다차원 배열
27
이차원 배열의 초기화(2/2)
이차원 배열의 제1크기만 생략할 수 있고 제2크기는 생략할 수 없다
다차원 배열
배열
문자열
연속된 문자들의 모임
문자열은 큰 따옴표("")로 표현한다.
문자열의 끝에는 널 문자('\0')를 함께 저장한다.
문자열 상수와 문자열 변수
문자열 상수 : 값이 변경되지 않는 문자열
"A"나 "Hello World" 등 문자열 리터럴이라고도 한다.
문자열 변수 : 프로그램 수행 중에 변경될 수 있는 문자열
char형 배열로 선언한다.
7장. 배열과 함수
문자 배열
29
문자 배열의 선언 및 사용
문자 배열의 크기는 “저장할 문자열의 길이 + 1”로 할당해야 한다.
문자 배열
문자열
문자 배열의 초기화(1/2)
문자열 상수를 이용해서 초기화한다.
문자 배열의 크기보다 큰 문자열로 초기화하면 컴파일 경고가 발생한다.
초기값을 지정할 때는 문자 배열의 크기를 생략할 수 있다.
7장. 배열과 함수
문자 배열
31
문자 배열의 선언 및 사용 예
문자 배열
문자열
01: /* Ex07_07.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: char str1[4] = "abc";
07: char str2[10] = "12345";
08: char str3[ ] = "Hello World";
09:10: printf("str1 = %s\n", str1);
11: printf("str2 = %s\n", str2);
12: printf("str3 = %s\n", str3);
13:14: return 0;
15: }
문자 배열의 선언 및 초기화
문자 배열의 출력
문자 배열의 초기화(2/2)
7장. 배열과 함수
문자 배열
33
문자 배열의 출력
문자열 전체를 한 번에 출력하려면 printf 함수의 형식 문자열로 “%s”를 지정한다.
문자 배열
문자열
문자 배열 사용시 주의 사항
배열의 원소가 아닌 문자 배열 전체에 직접 다른 문자열을 대입할 수 없다.
문자 배열에 저장된 각 문자를 하나씩 변경할 수 있지만, 보통은 문자열 처리 함 수를 이용한다.
7장. 배열과 함수
문자 배열
35
문자열 처리함수
문자열을 복사하거나, 문자열의 길이를 구하거나, 문자열을 비교할 때 이용한다.
문자열 처리 함수를 사용하려면 <string.h>를 포함해야 한다.
문자열 처리 함수
문자열
문자열의 복사(1/2)
문자열을 변경하려면 문자 배열에 직접 문자열을 대입하는 대신, strcpy 함수를 이용한다.
7장. 배열과 함수
문자열 처리 함수
37
문자열의 복사(2/2)
strcpy 함수에서 src 문자열의 길이가 dest 문자 배열의 크기보다 크면 실행 에러 가 발생할 수 있다.
strcpy 함수가 문자열을 복사할 때, 메모리가 충분한지 확인하지 않고 무조건 복 사하기 때문이다.
문자열 처리 함수
문자열
strcpy 함수의 사용 예
7장. 배열과 함수
문자열 처리 함수
39 01: /* Ex07_08.c */
02: #include <stdio.h>
03: #include <string.h>
04:05: int main(void) 06: {
07: char str1[20], str2[20];
08:09: strcpy(str1, "abcde");
10: printf("str1 = %s\n", str1);
11:12: strcpy(str2, str1);
13: printf("str2 = %s\n", str2);
14:15: return 0;
16: }
문자열 처리 함수의 헤더 파일 포함
크기가20인 문자 배열 선언
문자열의 복사
문자열의 복사
문자열의 길이 구하기
널 문자를 제외한 문자열의 길이를 구하려면 strlen 함수를 이용한다.
문자열 처리 함수
문자열
strlen 함수의 사용 예
7장. 배열과 함수
문자열 처리 함수
41 01: /* Ex07_09.c */
02: #include <stdio.h>
03: #include <string.h>
04:05: int main(void) 06: {
07: char str1[ ] = "abcde";
08: char str2[10] = "";
09:10: printf("str1의 길이 = %d\n", strlen(str1));
11: printf("str2의 길이 = %d\n", strlen(str2));
12: printf("문자열의 길이 = %d\n", strlen("Hello World"));
13:14: return 0;
15: }
문자열 처리 함수의 헤더 파일 포함
문자 배열의 선언 및 초기화
문자 배열의 길이 구하기
문자열의 비교
문자열을 비교할 때 == 연산자를 사용하면 문자열의 주소만 비교한다.
문자열 처리 함수
문자열
strcmp 함수의 사용 예(1/2)
7장. 배열과 함수
문자열 처리 함수
43 01: /* Ex07_10.c */
02: #include <stdio.h>
03: #include <string.h>
04:05: int main(void) 06: {
07: char str1[20];
08: char str2[20] = "ABCDE";
09:10: strcpy(str1, "abcde");
11:12: if( strcmp(str1, "abcde") == 0 ) 13: printf("두 문자열이 같습니다.\n");
14: else
15: printf("두 문자열이 다릅니다.\n");
16:
문자열 비교
strcmp 함수의 사용 예(2/2)
문자열 처리 함수
문자열
17: if( strcmp(str1, str2) == 0 )
18: printf("두 문자열이 같습니다.\n");
19: else
20: printf("두 문자열이 다릅니다.\n");
21:22: return 0;
23: }
문자열 비교
문자열의 연결
문자 배열의 끝에 다른 문자열을 연결하려면 strcat 함수를 이용한다.
7장. 배열과 함수
문자열 처리 함수
45
strcat 함수의 사용 예
문자열 처리 함수
문자열
01: /* Ex07_11.c */
02: #include <stdio.h>
03: #include <string.h>
04:05: int main(void)
scanf와 printf 함수
문자열을 입력 받아서 문자 배열에 보관하려면 scanf 함수의 형식 문자열로 %s를 사용한다.
문자열을 출력할 때도 printf 함수의 형식 문자열로 %s를 사용한다.
scanf 함수 사용 시 주의 사항
scanf 함수는 사용자가 입력된 내용 중 항상 공백 문자(‘ ’, ‘\t’, ‘\n’ 등)까지만을 입력으로 읽어온다.
빈칸을 포함한 문자열을 입력 받으려면 scanf 함수 대신 gets 함수를 이용해야 한 다.
7장. 배열과 함수
문자열의 입출력
47
문자열의 입출력 예
문자열의 입출력
문자열
01: /* Ex07_12.c */
02: #include <stdio.h>
03: #include <string.h>
04:05: int main(void) 06: {
07: char name[20];
08:09: printf("이름을 입력하세요 : ");
10: scanf("%s", name);
11: printf("%s씨, 안녕하세요?\n", name);
12:13: return 0;
14: }
문자열의 입력 문자 배열의 선언
문자열의 출력
빈칸을 포함한 문자열을
입력하면 빈칸까지만 입
력으로 처리된다.
gets 함수
빈칸을 포함한 한 줄의 문자열을 입력 받는 데 사용된다.
puts 함수
한 줄의 문자열을 출력하는 데 사용된다.
출력 후에 자동으로 줄 바꿈 문자를 출력한다.
7장. 배열과 함수
문자열의 입출력
49
공백이 있는 문자열의 입출력 예
문자열의 입출력
문자열
01: /* Ex07_13.c */
02: #include <stdio.h>
03: #include <string.h>
04:05: int main(void)
문자열 배열
문자열을 여러 개 저장하려면 문자 배열을 이차원 배열로 선언해야 한다.
문자열 배열 선언
제2크기는 저장할 문자열의 길이+1로 지정하고, 제1크기는 필요한 문자열의 개 수로 지정한다.
7장. 배열과 함수
문자열 배열
51
문자열 배열의 사용(1/2)
문자열 배열에 인덱스를 하나만 사용하면 배열에 보관된 문자열에 접근한다.
문자열 배열에 인덱스를 두 개 사용하면 특정 문자열의 특정 위치에 있는 문자에 접근한다.
문자열 배열
문자열
문자열 배열의 사용(2/2)
7장. 배열과 함수
문자열 배열
53
문자열 배열의 선언 및 사용 예
문자열 배열
문자열
01: /* Ex07_14.c */
02: #include <stdio.h>
03: #include <string.h>
04:05: int main(void) 06: {
문자열 배열의 초기화
문자열 배열을 초기화하려면 { } 안에 문자열 상수들을 나열한다.
문자열 배열도 이차원 배열이므로, 초기값을 지정할 때는 배열의 제1크기를 생략 할 수 있다.
7장. 배열과 함수
문자열 배열
55
배열
배열 : 같은 데이터 형의 변수들을 메모리에 연속적으로 할당하고 같은 이름으로 사용하는 기능
배열의 선언 : 배열 원소의 데이터 형, 배열 이름, 배열의 크기가 필요하다.
배열의 크기는 상수로만 지정한다.
배열의 사용 : 배열의 각 원소에 접근하려면 인덱스를 사용한다.
인덱스는 항상 0~(배열의 크기-1)사이의 값이다.
배열의 초기화 : 배열을 초기화하려면 { } 안에 초기값을 나열한다.
배열을 초기화할 때는 배열의 크기를 생략할 수 있다.
다차원 배열 : 배열의 차수에는 제한이 없다.
이차원 배열의 선언 : int arr[2][3];처럼 배열의 제1크기와 제2크기를 지정한다.
학습정리
문자열
문자열 : 널 문자로 끝나는 연속된 문자들의 모임
문자 배열 : 문자열를 보관해두고 사용하려면 문자 배열을 선언하고 사용한다.
문자 배열의 초기화 : 문자 배열을 초기화하려면 char str[10] = "abc";처럼 문자열 상수를 이용한다.
문자열 처리 함수 : 문자 배열의 변경하거나 문자열의 길이를 구하려면 문자열 처 리 함수를 이용해야 한다.
문자열의 입출력 : 입력 시 scanf나 gets, 출력 시 printf나 puts 이용
문자열 배열 : 문자열을 여러 개 저장하려면 문자 배열을 이차원 배열로 선언
7장. 배열과 문자열 57