Presentation is loading. Please wait.

Presentation is loading. Please wait.

C언어 프로그래밍의 이해 Ch08. 배열과 문자열.

Similar presentations


Presentation on theme: "C언어 프로그래밍의 이해 Ch08. 배열과 문자열."— Presentation transcript:

1 C언어 프로그래밍의 이해 Ch08. 배열과 문자열

2 목차 8.1 배열 8.2 함수의 배열 전달 8.3 문자열과 문자열 배열 8.4 배열 초기화 8.5 문자열 처리 함수
Ch08. 배열과 문자열 목차 8.1 배열 8.2 함수의 배열 전달 8.3 문자열과 문자열 배열 8.4 배열 초기화 8.5 문자열 처리 함수 2

3 8.1 배열 배열(array) 같은 형의 여러 변수들에 대한 저장소 집합 배열의 구성 요소는 인덱스(또는 첨자)로 접근됨
Ch08. 배열과 문자열 8.1 배열 배열(array) 같은 형의 여러 변수들에 대한 저장소 집합 복수개의 연속적인 기억 공간 배열의 구성 요소는 인덱스(또는 첨자)로 접근됨 가장 낮은 주소는 배열의 첫 번째 요소이며 가장 높은 주소는 마지막 요소에 대응 C에서 가장 일반적인 배열이 널(null)로 끝나는 문자들의 배열인 문자열(string)이다 C에서 배열은 사용형식에 따라 다차원으로 구성할 수 있음 Tip: 배열의 필요성 정수형의 변수가 100개 필요 하다고 가정해 보자. 만약 배열이 없다면 정수형 변수 100개를 각각 선언해주어야 할 것 이다. 이렇게 “배열” 기능은 같은 형의 변수를 편리하게 선언 할 수 있다 3

4 Ch08. 배열과 문자열 8.1 배열 1차원 배열의 선언 var_name은 이 배열의 이름, type은 배열 구성 요소들의 기본형, size는 배열이 저장할 요소들의 수를 정의 balance라는 이름의 double형 100개의 구성요소를 가진 배열 p[0]부터 p[9]까지 10개의 요소를 가진 문자형 배열의 선언 - 배열의 이름은 전체 배열의 첫 번째 구성요소의 주소 - 배열 이름 “var_name”은 “&varname[0]"와 같음 - 주소이므로 포인터 연산과도 연관 type var_name[size]; double balance[100]; char p[10]; 4

5 8.1 배열 1차원 배열과 메모리 메모리 주소 1000부터 시작하는 일곱 개의 문자 배열 배열을 저장하는데 필요한 메모리의 양
Ch08. 배열과 문자열 8.1 배열 1차원 배열과 메모리 메모리 주소 1000부터 시작하는 일곱 개의 문자 배열 배열을 저장하는데 필요한 메모리의 양 char a[7]; 총 바이트수 = sizeof(기본 형) * 배열의 크기 5

6 8.1 배열 1차원 배열의 할당 숫자 0부터 99까지를 100개의 구성요소를 가진 정수형 배열에 저장 Ch08. 배열과 문자열
void main(void) { int x[100]; /* 이것은 100개의 정수를 위한 배열 선언이다. */ int t; for(t=0; t<100; ++t) x[t] = t; } 6

7 8.1 배열 1차원 배열의 할당 C에서는 기본적으로 배열의 경계를 체크하지 않음
Ch08. 배열과 문자열 8.1 배열 1차원 배열의 할당 C에서는 기본적으로 배열의 경계를 체크하지 않음 따라서, 프로그래머는 필요한 곳에서 배열 경계에 대한 검토를 해야 함 다음 코드는 컴파일 시에는 오류가 없지만, for 루프가 배열 count의 범위를 벗어나서도 실행하고 있기 때문에 부정확한 것 int count[10], i; /* 범위를 벗어남 */ for(i=0; i<100; i++) count[i] = i; 7

8 8.1 배열 따라하기1 Ch08. 배열과 문자열 #include <stdio.h>
#define N 5 /* 배열의 크기 선언, 이런 형식의 배열 선언은 나중에 배열의 크기가 달라 질 때, 매우 유용한 프로그램 기법 */ int main(void) { int a[N]; // 배열의 선언 int i, sum = 0; for ( i = 0; i < N; ++ i) // 배열에 값 넣기 a[i] = 7 + i * i; for ( i = 0; i < N; ++ i) // 배열의 element 출력 printf("a[%d] = %d ",i, a[i] ); for ( i = 0; i < N; ++ i) // 배열 element의 합 sum += a[i]; printf("\n sum = %d\n", sum); // 합계 출력 return 0; } 8

9 8.1 배열 2차원 배열 2차원 배열의 선언 2차원 배열과 메모리 C는 다차원 배열들을 제공
Ch08. 배열과 문자열 8.1 배열 2차원 배열 C는 다차원 배열들을 제공 다차원 배열의 가장 간단한 형태가 2차원 배열 2차원 배열은 1차원 배열들에 대한 배열로 행(low)와 열(column)로 구성 2차원 배열의 선언 다음은 10행 20열 크기의 2차원 정수 배열 d를 선언한 것 2차원 배열과 메모리 배열을 저장하는데 필요한 메모리의 양 int d[10][20]; 바이트수 = 첫번째 인덱스의 크기 * 두번째 인덱스의 크기 * sizeof(기본 형) 9

10 Ch08. 배열과 문자열 8.1 배열 2차원 배열과 메모리 char a[4][3]; 10

11 8.1 배열 2차원 배열의 할당 1부터 12까지의 수를 2차원 배열에 저장하고 행 단위로 출력하는 예 Ch08. 배열과 문자열
#include <stdio.h> void main(void) { int t, i, num[3][4]; for(t=0; t<3; ++t) for(i=0; i<4; ++i) num[t][i] = (t*4)+i+1; for(t=0; t<3; ++t) { /* 출력하기 */ printf("%3d ", num[t][i]); printf("\n"); } 11

12 8.1 배열 따라하기2 Ch08. 배열과 문자열 #include <stdio.h>
#define M 3 // 행의 갯수 #define N 4 // 열의 갯수 int main(void) { int a[M][N], i, j, sum = 0; for ( i = 0; i < M; ++i ) // element에 값을 할당 for ( j = 0; j < N; ++j ) a[i][j] = i + j; for ( i = 0; i < M; ++i ){ // element 값을 행 단위로 출력 printf("a[%d][%d] = %d ", i, j, a[i][j] ); printf("\n"); } 12

13 Ch08. 배열과 문자열 8.1 배열 따라하기2 for ( i = 0; i < M; ++ i ) // element 값의 합 for ( j = 0; j < N; ++j ) sum += a[i][j]; printf("\nsum = %d\n\n", sum); // 합계 출력 return 0; } 13

14 8.1 배열 다차원 배열 C는 컴파일러에 따라 다르지만, 2차원 이상의 배열 제공
Ch08. 배열과 문자열 8.1 배열 다차원 배열 C는 컴파일러에 따라 다르지만, 2차원 이상의 배열 제공 3차원 이상의 배열은 많은 메모리가 필요하기 때문에 사용하지 않음 10 X 6 X 9 X 4 크기의 4차원 문자 배열은 2,160바이트의 메모리 요구 만약 정수형(2byte)일 경우, 4,320바이트 메모리 사용 double형(8byte)일 경우 17,280 바이트 메모리 사용 type name[size1] [size2] [size3] …[size N]; 14

15 8.2 함수의 배열 전달 C에서는 기본적으로 특정 함수의 실매개변수로 배열 자체 보다는 주소 또는 포인터의 형식으로 전달
Ch08. 배열과 문자열 8.2 함수의 배열 전달 C에서는 기본적으로 특정 함수의 실매개변수로 배열 자체 보다는 주소 또는 포인터의 형식으로 전달 함수의 호출 시에는 배열의 포인터(또는 배열 이름)를 사용하여 배열을 함수에 전달 func1()으로 배열 i[10]의 주소인 배열 이름 i를 전달 void main(void) { int i[10]; func1(i); . } 15

16 8.2 함수의 배열 전달 배열을 함수에 전달 하기 포인터를 이용하기 해당 크기의 배열로 전달 Ch08. 배열과 문자열
void func1(int *x) /* 포인터를 사용하여 배열 전달 받기 */ { } void func1(int x[10]) /* 해당 크기의 배열로 전달 받기 */ { } 16

17 8.2 함수의 배열 전달 배열을 함수에 전달 하기 크기가 없는 배열로 선언
Ch08. 배열과 문자열 8.2 함수의 배열 전달 배열을 함수에 전달 하기 크기가 없는 배열로 선언 방법들은 결국 함수의 형식매개변수로 (배열로서가 아니라) 어떤 정수형 포인터를 받으려고 한다는 것을 컴파일러에게 알리는 것 배열에서 중요한 것은 첫 번째 요소의 위치이고, 다음 요소들은 연속적이라는 특성을 상기하면, 함수로 배열을 전달한다는 것은 그 배열의 첫 번째 주소만 알면 그 배열의 전체요소들을 접근 처리할 수 있다는 것 void func1(int x[]) /* 크기 없는 배열로 전달 받기 */ { } 17

18 8.2 함수의 배열 전달 따라하기4 Ch08. 배열과 문자열 #include <stdio.h>
#define N // 배열의 크기 int main(void) { int a[N]; // 배열의 선언 int i, sum = 0; for ( i = 0; i < N; ++ i) // 배열에 값 넣기 a[i] = 7 + i * i; for ( i = 0; i < N; ++ i) // 배열의 element 출력 printf("a[%d] = %d ",i, a[i] ); sum = sum_array(a, N); // sum 변수에 sum_array() 함수의 리턴 값 할당 printf("\nsum = %d\n", sum); // 합계 출력 return 0; } 18

19 Ch08. 배열과 문자열 8.2 함수의 배열 전달 따라하기4 int sum_array( int a[], int n) // 배열 이름과 크기를 인자값으로 받는다. { int i, s = 0; for ( i = 0; i < n; ++i) // 배열 element의 합계 s += a[ i ]; return s; // 합계 리턴 } 19

20 8.3 문자열과 문자열 배열 문자열(string) 문자열이란 문자들의 집합 문자열(string)은 C의 기본 자료형이 아님
Ch08. 배열과 문자열 8.3 문자열과 문자열 배열 문자열(string) 문자열이란 문자들의 집합 문자열(string)은 C의 기본 자료형이 아님 C에서는 문자열을 위해서 문자형들을 수동적으로 1차원 배열로 구성하여 사용 문자열은 반드시 널(nul) 문자로 끝나야 함. 널은 ‘\0'로 나타내며, 이것은 컴파일러에게 문자들의 끝임을 알리는데 사용 문자열을 문자 배열로 선언할 때, 이들을 저장할 수 있는 최대의 문자수에 한 문자 길이를 더하여 선언 11개 문자들을 저장할 수 있는 배열 str을 선언 char str[12]; 20

21 8.3 문자열과 문자열 배열 문자열(string) C에서는 문자열에 대한 자료형을 포함하고 있지는 않지만, 문자열 상수는 허용
Ch08. 배열과 문자열 8.3 문자열과 문자열 배열 문자열(string) C에서는 문자열에 대한 자료형을 포함하고 있지는 않지만, 문자열 상수는 허용 문자열 상수(string constant)는 이중 인용부호(”)를 사용하는 문자들 다음은 11개 문자들을 저장할 수 있는 배열 str에 문자열 상수를 초기화 한 것 문자열 상수를 배열에 저장할 때는 끝에 수동적으로 널을 추가할 필요가 없다. 그 이유는 컴파일러가 자동적으로 이것을 추가해 주기 때문 char str[12]="hello There" 21

22 8.3 문자열과 문자열 배열 따라하기5 Ch08. 배열과 문자열 #include <stdio.h>
int main(void) { char str[80]; int i; printf("80개 미만의 문자열을 입력 하세요 :\n"); gets(str); /* 문자열 입력 */ for(i=0; str[i]; i++) printf("%c", str[i]); /* 입력된 문자열 출력 */ printf("\n"); return 0; } I am Jerry~!! 22

23 8.3 문자열과 문자열 배열 문자열 배열 여러 개의 문자열들이 필요한 경우에서는 문자열들의 배열 사용
Ch08. 배열과 문자열 8.3 문자열과 문자열 배열 문자열 배열 여러 개의 문자열들이 필요한 경우에서는 문자열들의 배열 사용 여러 개의 문자열들은 문자형들의 2차원 배열로 구성 문자들의 2차원 배열에서 행의 인덱스 크기는 문자열의 수를 결정하고, 열의 인덱스 크기는 각 문자열의 최대 길이를 지정 다음 코드는 30개의 문자열과 각 문자열은 최대 79개 문자들의 길이를 가진 배열을 선언 2차원 배열로 구성된 문자열들 각각에 대한 접근 행을 표시하는 왼쪽 인덱스만을 지정 다음은 str_array에서 세 번째 문자열로 gets() 함수를 호출하여 읽어 들이는 것(상용 C/C++ 코드에서 많이 사용) 위의 문장은 다음 문장과 기능적으로 같은 것 char str_array[30][80]; gets(str_array[2]); gets(&str_array[2][0]); 23

24 8.3 문자열과 문자열 배열 문자열 배열 간단한 텍스트 편집기 Ch08. 배열과 문자열
#include <stdio.h> #define MAX 100 #define LEN 80 char text[MAX][LEN]; /* 매우 간단한 텍스트 편집기 */ void main(void) { register int t, i, j; printf("Enter an empty line to quit.\n"); for(t=0; t<MAX; t++) { printf("%d: ", t); gets(text[t]); if(!*text[t]) break; /* 빈 라인이면 break */ } for(i=0; i<t; i++) { for(j=0; text[i][j]; j++) putchar(text[i][j]); putchar('\n'); 24

25 8.3 문자열과 문자열 배열 따라하기6 Ch08. 배열과 문자열 #include <stdio.h>
int main(void) { char text[10][80]; int i; for(i=0; i<10; i++){ printf("%d: ", i+1); gets(text[i]); } do{ printf("인텍스를 1과 10 사이에서 입력하세요.\n 종료를 원하시면 음수 를 입력하세요.\n"); scanf("%d", &i); i--; /* i의 값을 배열의 색인으로 사용하기 위해 조정한다. */ if(i>=0 && i<=9) printf("%s\n", text[i]); } while(i>=0); return 0; 25

26 8.4 배열 초기화 배열은 선언 시점에서 초기화할 수 있음 다음 예에서, 10개의 정수 배열은 1부터 10까지의 수로 초기화
Ch08. 배열과 문자열 8.4 배열 초기화 배열은 선언 시점에서 초기화할 수 있음 다음 예에서, 10개의 정수 배열은 1부터 10까지의 수로 초기화 배열 내부적으로는 0번째부터 9번째까지로 인덱스화 i[0]에는 1이 그리고 i[9]에는 10이 저장됨을 의미 type_specifier array_name[size1]...[sizeN] = {value_list}; int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 26

27 Ch08. 배열과 문자열 8.4 배열 초기화 문자열상수의 초기화 모든 문자열은 널(null)로 끝나기 때문에, 문자 배열의 크기는 이것까지 고려하여 충분히 긴 크기로 해야 함 문자열 상수를 사용할 때는 컴파일러에서 자동적으로 널 터미네이터를 제공 char array_name[size] = "string"; char str[9] = "I like C"; char str[9] = {'I', ' ', 'l', 'i', 'k', 'e', ' ', 'C', '\0'}; 27

28 8.4 배열 초기화 다차원 배열의 초기화 Ch08. 배열과 문자열 int sqrs[10][2] = { 1,1, 2,4,
3,9, 4,16, 5,25, 6,36, 7,49, 8,64, 9,81, 10,100 }; 28

29 8.4 배열 초기화 크기 없는 배열의 초기화 다음과 같이 오류 메시지 표를 구성하기 위해서 배열 초기화를 사용한다고 가정
Ch08. 배열과 문자열 8.4 배열 초기화 크기 없는 배열의 초기화 다음과 같이 오류 메시지 표를 구성하기 위해서 배열 초기화를 사용한다고 가정 각각의 오류 메시지에 따라 각 배열에 해당되는 문자들을 수동적으로 계산해야 함 char e1[12] = "Read error\n"; char e2[13] = "Write error\n"; char e3[18] = "Cannot open file\n"; 29

30 Ch08. 배열과 문자열 8.4 배열 초기화 크기 없는 배열의 초기화 크기 없는 배열을 사용하면 컴파일러가 문자열 초기화 상수 만큼씩을 각 배열들의 크기로 자동 계산해 줌 배열 초기화 시에 그 배열의 크기가 지정되지 않으면, 컴파일러는 모든 배열의 초기화 내용을 저장할 수 있는 충분한 크기의 배열을 자동적으로 생성 이렇게 초기화된 경우에, 다음 문장은 그 다음의 내용을 출력 char e1[] = "Read error\n"; char e2[] = "Write error\n"; char e3[] = "Cannot open file\n"; printf("%s has length %d\n", e2, sizeof e2); 출력: write error has length 13 30

31 8.4 배열 초기화 크기 없는 배열의 초기화 다차원 배열에서는 가장 왼쪽의 인덱스만을 제외하고 나머지 인덱스들은 지정되어야 함
Ch08. 배열과 문자열 8.4 배열 초기화 크기 없는 배열의 초기화 다차원 배열에서는 가장 왼쪽의 인덱스만을 제외하고 나머지 인덱스들은 지정되어야 함 int sqrs[][2] = { 1,1, 2,4, 3,9, 4,16, 5,25, 6,36, }; 31

32 8.5 문자열 처리 함수 C언어에서는 광범위하고 유용한 문자열 조작 함수들을 제공
Ch08. 배열과 문자열 8.5 문자열 처리 함수 C언어에서는 광범위하고 유용한 문자열 조작 함수들을 제공 이 함수들은 표준 헤더 파일 STRING.H를 사용 32

33 8.5 문자열 처리 함수 따라하기7 Ch08. 배열과 문자열 #include <stdio.h>
#include <string.h> void main(void) { char s1[80], s2[80]; gets(s1); gets(s2); printf("lengths: %d %d\n", strlen(s1), strlen(s2)); if(!strcmp(s1, s2)) printf("The strings are equal\n"); strcat(s1, s2); printf("%s\n", s1); strcpy(s1, "This is a test.\n"); printf(s1); if(strchr("hello“, 'e')) printf("e is in hello\n"); if(strstr("hi there", "hi")) printf("found hi\n"); } // strcmp()는 비교된 문자열이 같으면 거짓(0)을 리턴 //그러므로 같음을 시험하기 위한 조건에서는 이것의 역으로 하는 //논리 연산자 !를 사용 string Enter string1 Enter 33

34 실습 과제 <1>따라하기1 ~ 따라하기8 실습
Ch08. 배열과 문자열 실습 과제 <1>따라하기1 ~ 따라하기8 실습 <2> 실습과제1: 사용자 입력으로 숫자를 입력 받아서 천 단위마다 콤마를 찍어 출력하는 프로그램 작성(p303) 34

35 Q&A 35


Download ppt "C언어 프로그래밍의 이해 Ch08. 배열과 문자열."

Similar presentations


Ads by Google