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