64
1/64 YES C 제 6 제 제제제 제제제 6 6 제 제제제 제제제 제 제제제 제제제 제제제

제 6 장 배열과 문자열

  • Upload
    habib

  • View
    53

  • Download
    3

Embed Size (px)

DESCRIPTION

제 6 장 배열과 문자열. 문봉근. 제 6 장 배열과 문자열. 6.1 배열의 표현과 선언 6.2 1 차원 배열 6.3 다차원 배열 6.4 문자배열 ( 문자열 ) 6.5 배열 크기 정의 6.6 배열과 함수. 6.1 배열의 표현과 선언. 종류가 같은 데이터를 여러 개 선언 데이터 형이 같은 많은 양의 데이터를 처리하고자 할 때 사용 다른 변수들과 마찬가지로 반드시 먼저 선언이 되어야 한다. 6.1.1 배열의 표현. - PowerPoint PPT Presentation

Citation preview

Page 1: 제 6 장 배열과 문자열

1/64YES C 제 6 장 배열과 문자열

제제 66 장 배열과 문자열장 배열과 문자열

문봉근

Page 2: 제 6 장 배열과 문자열

2/64YES C 제 6 장 배열과 문자열

제제 66 장 배열과 문자열장 배열과 문자열6.1 6.1 배열의 표현과 선언배열의 표현과 선언6.2 16.2 1 차원 배열차원 배열6.3 6.3 다차원 배열다차원 배열6.4 6.4 문자배열문자배열 (( 문자열문자열 ))

6.5 6.5 배열 크기 정의배열 크기 정의6.6 6.6 배열과 함수배열과 함수

Page 3: 제 6 장 배열과 문자열

3/64YES C 제 6 장 배열과 문자열

6.1 배열의 표현과 선언• 종류가 같은 데이터를 여러 개 선언• 데이터 형이 같은 많은 양의 데이터를

처리하고자 할 때 사용• 다른 변수들과 마찬가지로 반드시 먼저

선언이 되어야 한다 .

Page 4: 제 6 장 배열과 문자열

4/64YES C 제 6 장 배열과 문자열

6.1.1 배열의 표현

• 배열은 여러 개의 데이터를 일련의 장소에 저장하므로 첨자 (index) 로 구별한다 .

• 첨자를 나타내기 위해서 []( 대괄호 , square bracket) 을 사용한다 .

• Ex : int names[4]; // 4 개의 데이터를 가지는 배열선언 .names[0] = 101; // 첫 번째 요소names[1] = 232; // 두 번째 요소names[2] = 231; // 세 번째 요소names[3] = 0; // 네 번째 요소

Page 5: 제 6 장 배열과 문자열

5/64YES C 제 6 장 배열과 문자열

예제 6.1 배열의 각 요소에 하나씩 문자 넣기

• #include <stdio.h>•

void main(void)• {• char word[20];

• word[0] = 'H';• word[1] = 'e';• word[2] = 'l';• word[3] = 'l';• word[4] = 'o';• word[5] = ‘\0’; /* 문자배열의 끝을 표시 */• printf("word[] 에 담겨진 내용은 -->%s\n", word );• }• 실행결과

– word[] 에 담겨진 내용은 Hello

Page 6: 제 6 장 배열과 문자열

6/64YES C 제 6 장 배열과 문자열

6.1.2 배열의 선언

• 배열의 선언 ( 문법 )– 데이터형 배열명 [ 요소의 개수 ];– data_type array_name[index];

• data_type : 배열의 데이터 형– 기본 데이터형 (int, float, char 등 )– 사용자 정의 데이터형 ( 구조체 , 공용체 등 )

• array_name : 배열명 ( 변수 정의 규칙에 따름 )• index : 배열의 요소의 개수

Page 7: 제 6 장 배열과 문자열

7/64YES C 제 6 장 배열과 문자열

예제 6.2 기본 배열의 선언을 위한 예제#include <stdio.h>

void main(void)

{

int numbers[100];

/* 100개의 요소를 가진 정수 배열 선언 */float averages[20];

/* 20개의 요소를 가진 실수 배열 선언 */

numbers[2] = 10; /* 세 번째 요소에 10을 저장 */--numbers[2]; /* 저장된 값 (10)을 1 감소 */printf("배열 numbers의 세 번째 요소는 %d이다 .",

numbers[2]);

}

실행결과배열 numbers의 세 번째 요소는 9이다 .

Page 8: 제 6 장 배열과 문자열

8/64YES C 제 6 장 배열과 문자열

6.2.1 1 차원 배열의 선언

• 1 차원 배열은 배열의 index 가 1 개인 배열을 말한다 .

• 문법– 데이터형 배열명 [ 요소의 개수 ];– int array[10];

Page 9: 제 6 장 배열과 문자열

9/64YES C 제 6 장 배열과 문자열

예제 6.3 array 라는 배열을 선언하고 , 지정된 요소에 데이터 넣기

• int a[10]; a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

a[9]

• int a = 3, array[10];• array[a] = 100;• array[9] = 200;• array[10] = 400;

• 설명 – array[10] = 400 인 경우 에러 가능성 있음

Page 10: 제 6 장 배열과 문자열

10/64YES C 제 6 장 배열과 문자열

예제 6.4 1 차원 배열의 초기화 및 선언 예

⑴ int a[10] = { 10, 30, 50, 70, 100, 40, 30, 55, 223, 765 };

⑵ int b[] = { 10, 30, 50, 70, 100, 40, 30, 55, 223, 765 };

⑶ int c[10] = { 10, 30, 50, 70, 100, 40, 30, };

/* 숫자 뒤에 콤마가 있다 .*/

⑷ int d[3] = { 1, 10, 5, 7, 8 };

⑸ char ch[5] = "Test";

⑹ int numbers[10];

⑺ static int numbers[10] = { 34, 27, 16 };

⑻ static int numbers[] = { 2, -3, 45, 79, -14, 5, 9, 28, -1, 0};

⑼ static char text[] = "Welcome to Korea.";

⑽ static float radix[12] = { 134.362, 1913.248 };

⑾ double radians[1000];

Page 11: 제 6 장 배열과 문자열

11/64YES C 제 6 장 배열과 문자열

예제 6.5 배열 선언시 초기화한 후 , 출력하는 프로그램 .

#include <stdio.h>

void main(void)

{

   int x;

   static int  values[] = { 1,2,3,4,5,6,7,8,9 };

static char  word[] ={ 'H','e','l','l','o' };

   for( x = 0; x < 9; ++x )

      printf("values[%d] = %d\n", x, values[x]);

   for( x = 0; x < 5; ++x )

      printf("word[%d] = %d\n", x, word[x]);

}

Page 12: 제 6 장 배열과 문자열

12/64YES C 제 6 장 배열과 문자열

예제 6.6 1 차원 배열을 이용한 합계계산 프로그램

#include <stdio.h>

void main(void)

{

   int i, data[] = {78,55,99,75,84,39,67,98,87,100};

   /* 배열 선언 */

   long int sum = 0;   /* 초기 값을 0 으로 둔다 . */

   float ave;

   for (i = 0; i < 10; i++)

        sum += data[i];

   ave = (float)sum / 10.0;

 printf("Total = %ld  Average = %.2f\n", sum, ave);

}

Page 13: 제 6 장 배열과 문자열

13/64YES C 제 6 장 배열과 문자열

예제 6.7 년 , 월 , 일을 입력하여 1 월 1 일부터 입력한 날짜까지의 전체일수를 계산하는 프로그램

• #include <stdio.h>

• void main(void)• {• int year, month , day;• int days; /* 전체 날수를 기억 */• int ia[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };• printf(" 년도를 입력하시오 : "); scanf("%d",&year);• printf(" 월을 입력하시오 : "); scanf("%d",&month);• printf(" 일을 입력하시오 : "); scanf("%d",&day);

• if(day > 31) {• printf(" 에러 : 일이 잘못 입력되었습니다 .\n");• return;• }• else if(month==4 && month==6 && month==9 && month==11 && day>30 ) {• printf(" 에러 : 일이 잘못 입력되었습니다 .\n");• return;• }

Page 14: 제 6 장 배열과 문자열

14/64YES C 제 6 장 배열과 문자열

예제 6.7( 계속 )

• else if(month == 2) {• if(year%400==0 || (year%4==0 && year%100 !=0)) {• if( day > 29 ) {• printf(" 에러 : 일이 잘못 입력되었습니다 .\n");• return;• }• }• else {• if( day > 28 ) {• printf(" 에러 : 일이 잘못 입력되었습니다 .\n");• return;• }• }• }

• if (month >= 1 && month <= 12) {• days = ia[month-1] + day; /* 날수를 계산 */• if (month>2 && (year%400==0 || (year%4==0 && year%100 !=0)))• ++days; /* 윤년이고 3 월 이후면 하루를 증가 */• printf("%d 년 %d 월 %d 일은 %d 번째 날입니다 .\n",• year, month, day, days);• }• else• printf(" 에러 : 월이 잘못 입력되었습니다 !\n");• }

Page 15: 제 6 장 배열과 문자열

15/64YES C 제 6 장 배열과 문자열

예제 6.8 입력된 수들의 ~

• #include <stdio.h>

• void main(void)• {• int ia[10] = { 0, }; /* 초기 값이 모두 0 */• int i;• printf("0 에서 99 사이의 값들을 입력하시오 . 그 이외의 값이면 종료 .\n");• scanf("%d",&i);• while (i >= 0 && i <= 99) {• ++ia[i / 10];• scanf("%d",&i);• }• printf("\n 발생 빈도수 \n");• for (i = 0; i < 10; i++)• printf("%2d ~ %2d : %3d\n",i*10,(i+1)*10-1,ia[i]);• }

Page 16: 제 6 장 배열과 문자열

16/64YES C 제 6 장 배열과 문자열

예제 6.9 N 개의 정수를 읽어 들여 오름차순으로 정렬하는 프로그램 . 미리 100개의 배열을 잡아두고 입력할 데이터의 개수를 받아들인 후 계산한다 .

/* N 은 100 을 넘지 않는다 */

#include <stdio.h>

void main(void)

{

       static int data[100];

       int i, j, N;

       printf(" 입력할 데이터의 개수를 입력하시오 : ");        scanf("%d",&N);

       for (i = 0; i < N; i++) /*  배열의 입력 */               scanf("%d",&data[i]);

Page 17: 제 6 장 배열과 문자열

17/64YES C 제 6 장 배열과 문자열

       for (i = 0; i < N-1; i++)

              for (j = i + 1; j < N; j++)

                     if (data[i] > data[j]) {

/*XOR 를 이용한 데이터 교환 */

                            data[i] ^= data[j];

                            data[j] ^= data[i];

                            data[i] ^= data[j];

                     }

       printf(" 정렬된 데이터 :\n");        for (i = 0; i <= N - 1; i++) {

     /*  정렬된 배열을 출력 */               printf("%10d",data[i]);

              if ((i + 1) % 7 == 0)

                     printf("\n");

       }

}

예제 6.9 ( 계속 )

Page 18: 제 6 장 배열과 문자열

18/64YES C 제 6 장 배열과 문자열

예제 6.10 데이터를 읽어 그 중 가장 긴 라인의 길이와 그 라인 전체를 출력하는 프로그램• #include <stdio.h>

• char data[250];

• void main(void)• {• char mdata[250]; /* 지금까지 읽은 라인 중 가장 긴 라인을 기억시킬 배열 */• int max = 0;• int l, i;• while (1) { /* 한 줄을 읽음 */• l=0;• while(1) {• data[l] = getchar();• if(data[l] == '\n' || data[l] == EOF) break;• l++;• }

• if (l > max) { /* 이것이 현재 라인 보다 길면 */• for (i = 0; i <= l - 1; i++)• mdata[i] = data[i]; /* 그대로 복사 */• max = l - 1;• }• if(data[l] == EOF) break;• }• if (max == 0) /* 읽어들인 라인이 없으면 */• printf(" 데이터가 없습니다 .\n");• else {• printf(" 가장 긴 줄은 : ");• for (i = 0; i <= max - 1; i++)• putchar(mdata[i]);• printf("\n 길이 : %d\n",max);• }• }

Page 19: 제 6 장 배열과 문자열

19/64YES C 제 6 장 배열과 문자열

예제 6.11 10 명의 ~

• #include <stdio.h>• #include <conio.h>

• void main(void)• {• int jumsu[10], sum=0, avg=0, i;• for(i=0;i<10;i++)• {• printf("input(jumsu %d )=>",i+1);• scanf("%d",&jumsu[i]);• printf("\n");• }• for(i=0;i<10;i++)• sum += jumsu[i];• printf("total = %d , avg = %d\n",sum, sum/i);• }

Page 20: 제 6 장 배열과 문자열

20/64YES C 제 6 장 배열과 문자열

예제 6.12 0 에서 9 까지 제곱의 값을 배열에 기억시켜 출력하는 프로그램을 작성하라 .

• #include <stdio.h>• #include <conio.h>

• void main(void)• {• int i, mul[10];• printf(" 제곱의 합 출력 프로그램 \n");• for(i=0;i<10;i++)• mul[i]=i*i;• for(i=0;i<10;i++)• printf("%d * %d = %2d\n“,i,i,mul[i]);• getch();• }

Page 21: 제 6 장 배열과 문자열

21/64YES C 제 6 장 배열과 문자열

6.2.2 1 차원 배열의 초기화

① 데이터 초기값을 선언시에 미리 대입하는 방법 int arr[4]={10,20,30,40};     char ab[3]={'A','B','C'};

② loop 를 이용하여 배열의 모든 값들을 0 으로 초기화하는 방법        int array[10];        for(i=0;i<10;i++)               array[i] = 0;

③ 선언된 배열에 사용자가 직접 외부로부터 입력하는 방법        int a[10];        for(i=0;i<10;i++){               printf("\n input a[%d] = ", i);               scanf("%d",&a[i]);        }

Page 22: 제 6 장 배열과 문자열

22/64YES C 제 6 장 배열과 문자열

예제 6.13 1 차원 배열 x[20] 을 선언하고 , 초기값으로 2 의 배수를 저장하는 프로그램

• #include <stdio.h>

• void main(void)• {• int x[10], i;

• for(i=0;i<10;i++)• x[i]=i*2;• for(i=0;i<10;i++)• printf("x[%d] = %2d\n",i, x[i]);• }

Page 23: 제 6 장 배열과 문자열

23/64YES C 제 6 장 배열과 문자열

6.3 다차원 배열 • 다차원 배열 (multi dimensional arrays)

– 배열의 요소를 지정하는 두 개 이상의 index를 가진다 .

• int multi[2][3]; 과 같이 선언했을 경우

– 행우선 배열

– 열우선 배열

[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]

[0][0] [1][0] [0][1] [1][1] [0][2] [1][2]

Page 24: 제 6 장 배열과 문자열

24/64YES C 제 6 장 배열과 문자열

6.3.1 다차원 배열의 선언과 계산 •다차원 배열의 선언

int    m1[10][10];

float  matrix[4][4][4];

static int m2[2][2] = { {0,1}, {2,3} };

sum = m1[i][j] + m2[k][l];

Page 25: 제 6 장 배열과 문자열

25/64YES C 제 6 장 배열과 문자열

다차원 배열을 초기화하거나 배열의 첨자를 사용하는 방법

① 다차원 배열에 초기값을 저장하는 방법     int a[2][3]={10,20,30,40,50,60};

    int a[2][3]={{10,20,30},{40,50,60}};

② 배 열 을 먼 저 선 언 하 고 반 복 문 (for) 을 이용하여 배열을 0 으로 초기화하는 방법

    int array[5][4];

    for(i=0;i<5;i++)

           for(j=0;j<4;j++)

                  rray[i][j] = 0;

Page 26: 제 6 장 배열과 문자열

26/64YES C 제 6 장 배열과 문자열

③ 배열을 먼저 선언하고 , 이 배열에 외부로부터 입력을 통해서 받아들이는 방법

    int a[5][4];

    for(i=0;i<5;i++)

           for(j=0;j<4;j++){

              printf("\n input[%d][%d] :", i, j);

              scanf("%d",&a[i][j]);

           }

④ 다차원 배열의 내용을 보기 위하여 출력하는 방법

int a[3][4] = { {10,20,30,40}, {50,60,70,80},

{90,100,110,120} };

    for(i=0;i<3;i++)

       for(j=0;j<4;j++)

         printf("a[%d][%d] = %d  ", i, j, a[i][j]);

Page 27: 제 6 장 배열과 문자열

27/64YES C 제 6 장 배열과 문자열

예제 6.14 다차원 배열의 초기화

⑴ int ia[2][3] = {{1,2,3}, {4,5,6}};

⑵ int ia[][3] = {1,2,3,4,5,6};

⑶ int ia[][] = {1,2,3,4,5,6}; /* 에러 */ ⑷ int ja[2][3][2]  = {{{1,2},{3,4},{5,6}},

{{7,8},{9,10},{11,12}}};

⑸ int ja[][3][2] = {1,2,3,4,5,6,7,8,9,10,

11,12};

Page 28: 제 6 장 배열과 문자열

28/64YES C 제 6 장 배열과 문자열

예제 6.15 3*3 행렬 2 개를 읽어 들여 이의 합을 출력하는 프로그램

• #include <stdio.h>

• void print_matrix(int M[3][3])• {• int i, j;• for (i = 0; i < 3; i++) {• for (j = 0; j < 3; j++)• printf("%d ",M[i][j]);• printf("\n");• }• }

• void read_matrix(int M[3][3]) /* 3*3 행렬을 읽어 들이는 함수 */• {• int i, j;• for (i = 0; i < 3; i++)• for (j = 0; j < 3; j++)• scanf("%d",&M[i][j]);• }

Page 29: 제 6 장 배열과 문자열

29/64YES C 제 6 장 배열과 문자열

예제 6.15 3*3 행렬 2 개를 읽어 들여 이의 합을 출력하는 프로그램( 계속 )

• void main(void)• {• int A[3][3], B[3][3], C[3][3];• int i, j;

• printf("*** Input the first matrix(3*3) ***\n");

• /* read matrix A */• for (i = 0; i < 3; i++)• for (j = 0; j < 3; j++)• scanf("%d",&A[i][j]);

• /* printf matrix A : 함수로 했을 경우 배열의 이름을 인자로 전달한다 */• printf("\t## A ##\n");• for (i = 0; i < 3; i++) {• for (j = 0; j < 3; j++)• printf("%d ",A[i][j]);• printf("\n");• }

Page 30: 제 6 장 배열과 문자열

30/64YES C 제 6 장 배열과 문자열

예제 6.15 3*3 행렬 2 개를 읽어 들여 이의 합을 출력하는 프로그램( 계속 )

• printf("*** Input the second matrix(3*3) ***\n");• /* read matrix B */• for (i = 0; i < 3; i++)• for (j = 0; j < 3; j++)• scanf("%d",&B[i][j]);

• /* printf matrix B : 함수로 했을 경우 배열의 이름을 인자로 전달한다 */• printf("\t## B ##\n");• for (i = 0; i < 3; i++) {• for (j = 0; j < 3; j++)• printf("%d ",B[i][j]);• printf("\n");• }

• for (i = 0; i < 3; i++)• for (j = 0; j < 3; j++)• C[i][j] = A[i][j] + B[i][j];• • printf("\n*** C = A + B ***\n");• /* printf matrix C : 함수로 했을 경우 배열의 이름을 인자로 전달한다 */• printf("\t## C ##\n");• for (i = 0; i < 3; i++) {• for (j = 0; j < 3; j++)• printf("%2d ",C[i][j]);• printf("\n");• }• }

Page 31: 제 6 장 배열과 문자열

31/64YES C 제 6 장 배열과 문자열

예제 6.16 2 차원 배열의 초기화하는 예제

• #include <stdio.h>

• void main(void)• {• int array[4][3] = {{100, },{0, } ,{111, 222}, };• int i, j;

• for(i = 0; i < 4; i++)• {• for(j = 0; j < 3; j++)• printf("array[%d][%d] = %d\n", i, j, array[i][j]);• putchar('\n');• }• }

Page 32: 제 6 장 배열과 문자열

32/64YES C 제 6 장 배열과 문자열

예제 6.17 2 차원 배열의 초기화 및 행의 크기가 지정되지 않은 배열에서 행의 크기를 계산하는 프로그램 #include <stdio.h> void main(void) {        int A[ ][3] = {{100,200,0},{0,},

{111,0,0}, {0,}};        int i, j, size;        size = sizeof(A)/sizeof(int)/3;        for(i = 0; i < size; i++)        {           for(j=0; j<3; j++)

printf("A[%d][%d] = %d\n",i, j, A[i][j]);

              putchar('\n');        } }

Page 33: 제 6 장 배열과 문자열

33/64YES C 제 6 장 배열과 문자열

예제 6.18 행과 열의 ~

• /* 2 차원 배열 array[3][5] 의 각 행의 합과 전체 합을 계산하는 프로그램 */

• #include <stdio.h>• #define ROW 3• #define COLUMN 5•

• void main(void)• {• int array[ROW][COLUMN];• int i, j;• long temp, total = 0;•

Page 34: 제 6 장 배열과 문자열

34/64YES C 제 6 장 배열과 문자열

예제 6.18 행과 열의 ~( 계속 )

• for(i = 0; i < ROW; i++)• {• temp = 0;• for(j = 0; j < COLUMN; j++)• {• printf("Input data in array[%d][%d] : ", i, j);• scanf("%d", &array[i][j]);• temp += array[i][j];• }• switch( i ) /* 각 행의 합을 출력 */• {• case 0: printf("\narray[%d] = %ld\n\n", i, temp);• break;• case 1: printf("\narray[%d] = %ld\n\n", i, temp);• break;• case 2: printf("\narray[%d] = %ld\n\n", i, temp);• } /* end of switch */• total += temp;• } /* end of for statement */• printf("The total of array is %ld \n", total);• }

Page 35: 제 6 장 배열과 문자열

35/64YES C 제 6 장 배열과 문자열

예제 6.19 주어진 2 차원 배열에서 , 모든 요소들의 합을 계산하고 , total 을 출력하는 프로그램을 작성하라 .

#include <stdio.h> void main(void) {        static int m[][] = { {10,5,-3}, {9, 0, 0},

{32,20,1}, {0,0,8} };

       int row, column, sum;        sum = 0;        for( row = 0; row < 4; row++ )          for( column = 0; column < 3; column++ )                 sum = sum + m[row][column];         printf("The total is %d\n", sum ); } 실행결과

The total is 82

Page 36: 제 6 장 배열과 문자열

36/64YES C 제 6 장 배열과 문자열

6.4.1 문자배열

• 문자열을 처리하는 방법– 문자배열 (character arrays) 을 사용하는 방법– 포인터를 사용하는 방법

Page 37: 제 6 장 배열과 문자열

37/64YES C 제 6 장 배열과 문자열

(1) 문자열 상수

• 문자열 상수는 “…”로 문자열을 묶어 주기만 하면 된다 .

주 소 0x01  0x02  0x03  0x04  0x05  0x06  0x07 ASCII 코드 0x53  0x74  0x72  0x69  0x6E  0x67  0x00 문 자 S      t      r      i    n      g  (NULL)          ( 주소는 임의로 정한 주소임 )

• 문자열의 마지막에는 NULL 문자열이 들어간다 .

Page 38: 제 6 장 배열과 문자열

38/64YES C 제 6 장 배열과 문자열

(2) 문자열 변수

• C 에 서 는 문 자 열 데 이 터 형 이 없 으 므 로 문 자 배 열 을 사용하여 문자열 처리를 한다 .

• 문자배열– char 배열이름 [ 문자열길이 +1] = “ 초기문자열” ;

• 문법– 배열이름 [ 첨자 ] = 값– 변수 = 배열이름 [ 첨자 ]

Page 39: 제 6 장 배열과 문자열

39/64YES C 제 6 장 배열과 문자열

• 문자열을 복사할 때는 strcpy 함수를 이용하여야 하며 , 직접 대입할 수 없다 .

• 직접 대입을 할 경우는 하나씩 배열의 요소에 넣어야 한다 .char str[10] = "String"; strcpy( 문자배열이름 , 문자열 );strcpy(str,"Welcome!"); str="Hello!"; /* 이렇게 사용할 수는 없다 . */ str[0]='H';  /* 대입연산자를 사용할 경우는 일일이

이렇게 한 문자씩 대입한다 . */ str[1]='e'; str[2]='l'; str[3]='l'; str[4]='o'; str[5]='!'; str[6]=NULL; /* 또는 str[6]='\0'; */

Page 40: 제 6 장 배열과 문자열

40/64YES C 제 6 장 배열과 문자열

(3) 문자열 상수의 초기화

• const char str[10]="String"; • const char str[]="String";

Page 41: 제 6 장 배열과 문자열

41/64YES C 제 6 장 배열과 문자열

예제 6.20 문자열 복사함수를 사용하는 방법과 하나의 배열 요소에 대입하는 방법 .

/* 파일 이름 : 문자열 처리 프로그램 . */ #include <stdio.h> #include <string.h> void main(void) {        char str[10];        strcpy(str,"welcome");        printf("%s\n",str);        str[0]='W';        printf("%s\n",str); } 실행결과welcomeWelcome

Page 42: 제 6 장 배열과 문자열

42/64YES C 제 6 장 배열과 문자열

(4) 특수 문자

문자 기능\a Beep 음을 컴퓨터 스피커로 출력\b Back space\n 현재 위치한 줄의 다음 줄로 내려간다 .\r 현재 위치한 줄의 맨 처음으로 간다 .\t 수평 Tab\v 수직 Tab\\ \(역슬래쉬 )\‘ 작은 따옴표\“ 큰 따옴표\0 NULL 문자\0?? 8 진수 ?? 에 대한 문자\x?? 16 진수 ?? 에 대한 문자 .

Page 43: 제 6 장 배열과 문자열

43/64YES C 제 6 장 배열과 문자열

예제 6.21 특수문자 처리하는 방법 . #include <stdio.h> void main(void) {        printf("C Programming\n");        printf("C \bProgramming\n");        printf("\'C\' Programming\n");        printf("\"C Programming\"\n");        printf("C \tProgramming\n");        printf("C \rProgramming\n");        printf("C\n\tProgramming\n");        printf("C Programming\a\n"); }

Page 44: 제 6 장 배열과 문자열

44/64YES C 제 6 장 배열과 문자열

6.4.2 문자분류 및 문자변환 표준함수함수 설명 해당문자

isalnum(int c) 알파벳 또는 숫자인가 ? A~Z, a~z, 0~9

isalpha(int a) 알파벳인가 ? A~Z, a~z

isascii(int a) ASCII 문자인가 ?

iscntrl(int a) 제어문자인가 ?BEL, BS, CR, FF, HT, NL, VT

isdigit(int a) 10 진수인가 ? 0~9

isgraph(int a) 그래픽 문자인가 ? isalnum or ispunctislower(int a) 소문자인가 ? a~z

isprintf(int a) 출력 가능한 문자인가 ? isgraph or isspace

ispunct(int a) 구두점 문자인가 ?! # % & ( ) ; < = > ? [ \ ] + , . / : ^ _ { | }

isspace(int a) 공백문자인가 ?CR, FF, HT, NL, VT, space

isupper(int a) 대문자인가 ? A~Z

isxdigit(int a) 16 진수인가 ? 0~9, A~F, a~f

Page 45: 제 6 장 배열과 문자열

45/64YES C 제 6 장 배열과 문자열

6.4.2 문자분류 및 문자변환 표준함수 ( 계속 )

함수 설명toascii(int a) ASCII 로 변환tolower(int a) 소문자로 변환toupper(int a) 대문자로 변환char *strupr(char *s) 문자열을 대문자로 변환char *strlwr(char *s) 문자열을 소문자로 변환

Page 46: 제 6 장 배열과 문자열

46/64YES C 제 6 장 배열과 문자열

예제 6.22 toupper() 를 사용하여 문자열을 한번에 한 문자씩 대문자로 변환하는 예제 .

#include <stdio.h> #include <ctype.h> void main(void){    char name[80];    int loop;  printf("Enter in a name in lowercase\n");    scanf( "%s", name );    for( loop = 0; name[loop] != 0; loop++ )         name[loop] = toupper( name[loop] );     printf("The name in uppercase is %s",

name);}

Page 47: 제 6 장 배열과 문자열

47/64YES C 제 6 장 배열과 문자열

예제 6.23 예제 6.22 를 strupr 함수를 사용하여 한꺼번에 대문자로 바꾸기 #include <stdio.h> #include <ctype.h> void main(void) {    char name[80]; /*declare an array of characters 0-79*/

   printf("Enter in a name in lowercase\n");    scanf( "%s", name );    strupr( name );    printf("The name is uppercase is %s\n",

name );    strlwr( name );    printf("The name is lowercase is %s\n",

name ); }

Page 48: 제 6 장 배열과 문자열

48/64YES C 제 6 장 배열과 문자열

표 6.4 보이는 문자 (visible graphic character)

구분 해당 문자alphabet A~Z, a~z

digit 0~9

underscore _

punctutation! " # % & ' ( ) * + , -

. / : ; < = > ? [ \ ] ^ { | } ~

Page 49: 제 6 장 배열과 문자열

49/64YES C 제 6 장 배열과 문자열

표 6.5 추가 그래픽 문자(Additional graphic characters)

문자 기능space Blank space

BEL Bell( 경고음 )

BS Back space

FF Form feed

NL New line

CR Carriage return

HT Horizontal tab

VT Vertical tab

Page 50: 제 6 장 배열과 문자열

50/64YES C 제 6 장 배열과 문자열

표 6.6 제어 문자 (escape sequence)

문자 기능“ \”

‘ \’

? \?

\ \\

BEL \a

BS \b

FF \f

NL \n

CR \r

HT \t

VT \v

Page 51: 제 6 장 배열과 문자열

51/64YES C 제 6 장 배열과 문자열

표 6.7 숫자를 이용한 제어 문자(numerical escape sequence)

표시 기능\d or \dd or \ddd 10 진수 escape sequence

\xh or \xhh 16 진수 escape sequence\0oo or \0ooo 8 진수 escape sequence

Page 52: 제 6 장 배열과 문자열

52/64YES C 제 6 장 배열과 문자열

예제 6.24 문자처리함수를 이용한 프로그램이다 . 그 결과를 분석해보자 #include <stdio.h> #include <ctype.h> #include <conio.h> void main(void) {        int c;        printf("\n isalpha : \n");        for(c=0;c<127;c++)               if(isalpha(c))putchar(c);        printf("\n isdigit :\n");        for(c=0;c<127;c++)               if(isdigit(c))putchar(c);        printf("\n islower :\n");

Page 53: 제 6 장 배열과 문자열

53/64YES C 제 6 장 배열과 문자열

예제 6.24( 계속 )

       for(c=0;c<127;c++)               if(islower(c))putchar(c);        printf("\n ispunct :\n");        for(c=0;c<127;c++)               if(ispunct(c))putchar(c);        printf("\n isupper :\n");        for(c=0;c<127;c++)               if(isupper(c))putchar(c);        getch(); }

Page 54: 제 6 장 배열과 문자열

54/64YES C 제 6 장 배열과 문자열

6.4.3 데이터 변환함수 기능

double atof(char *string) 스트링을 부동소수점으로 변환

int atoi(char *string) 스트링을 long integer 로 변환

char *itoa(int value, char *string, int radix)

정수를 주어진 기수법으로 스트링으로 변환

char *ltoa(long value, char *string, int radix)

long 정수를 주어진 기수법으로 스트링으로 변환

double strtod(char *string, char *endptr)

스트링을 double 부동소수점으로 변환

long strtol(char *string, char *endptr, int radix)

스트링을 주어진 기수법으로 long 정수로 변환

unsigned long strtoul(char *string, char *endptr, int radix)

스트링을 unsigned long 으로 변환

Page 55: 제 6 장 배열과 문자열

55/64YES C 제 6 장 배열과 문자열

예제 6.25 문자열을 숫자 데이터형으로 변환하는 프로그램 . 문자열은 계산이 안되지만 숫자로 변환한 후에는 계산이 가능하게 된다 .

#include <stdio.h>

#include <stdlib.h>

void main(void) {

   char string1[] = "12.434";

   char string2[] = "43.534";

  char string3[] = "453",

string4[] = "985";

  /* printf("%s", string1 + string2); 이 부분은 컴파일 시 에러가 난다 . 문자열은 덧셈을 할 수 없으며 , 어떤 컴파일러에서는 되는 곳도 있다 .*/

Page 56: 제 6 장 배열과 문자열

56/64YES C 제 6 장 배열과 문자열

예제 6.25( 계속 )

   printf("%f\n", atof(string1) + atof(string2));

/* 실수로 변환이 되었으므로 연산이 가능하다 . */    /* printf("%s", string3 + string4);

마찬가지로 에러가 발생한다 .*/    printf("%d\n",

atoi(string3) + atoi(string4));    /* 정수로 변환이 되었으므로 연산이 가능하다 . */ } 실행결과

55.9680001438

Page 57: 제 6 장 배열과 문자열

57/64YES C 제 6 장 배열과 문자열

6.4.4 스트림 입출력함수 기능

int fgetc(FlLE *file_pointer) 스트림으로부터 한 문자 가져오기

char *fgets(char *string, int maxchar, FILE *file_pointer)

파일로부터 스트링 읽기

int fputc(int c, FILE *file_pointer) 스트림에 한 문자 쓰기

int fputchar(int c) stdout 에 한 문자 쓰기

int fputs(char *string, FILE *file_pointer)

스트림에 스트링 쓰기

int getc(FlLE *file_pointer) 스트림으로부터 한 문자 읽기

int getchar(void) stdin 으로부터 한 문자 읽기

char *gets(char *buffer) stdin 으로부터 한 줄을 읽어서 버퍼에 넣기

int printf(const char *format, args); stdout 으로 형식화된 출력 쓰기

Page 58: 제 6 장 배열과 문자열

58/64YES C 제 6 장 배열과 문자열

6.4.4 스트림 입출력 ( 계속 )

함수 기능int putc(int c, FILE *file_pointer) 한 문자를 스트림에 쓰기int putchar(int c) stdout 에 한 문자 쓰기int puts(char *string) stdout 에 스트링 쓰기

int scanf(char *format_string, args)stdin 으로부터 형식화된 입력 읽기

int sprintf(char *string,

char *format_string, args)스트링에 형식화된 출력 쓰기

int sscanf(char *buffer,

char *format_string, args)스트링으로부터 형식화된 입력 읽기

Page 59: 제 6 장 배열과 문자열

59/64YES C 제 6 장 배열과 문자열

6.4.5 문자열 처리함수 기능

char *strcat(char *s1, const char *s2);

s1 에 s2 를 추가하고 s1 을 return

char *strchr(const char *s, int c);s 에서 c 가 발생하는 첫 번째 위치 찾기

int strcmp

(const char *s1, const char *s2)

s1 과 s2 를 비교 , 두 문자열 이 같으면 0, s1 이 크면 양수 , 아니면 음수를 return

int strcoll

(const char *s1, const char *s2);

s1 과 s2 비교 , s1 이 크면 양수 , 같으면 0, 아니면 음수를 return

char* strcpy(char *s1, const char *s2)

s2 에서 s1 로 스트링 복사

size_t strcspn

(const char *s1, const char *s2);

1 에 서 s2 와 같 은 문 자 열 검색 , 문자열이 있으면 위치 return

Page 60: 제 6 장 배열과 문자열

60/64YES C 제 6 장 배열과 문자열

6.4.5 문자열 처리 ( 계속 )

함수 기능char* strerror(int errcode) 특정한 에러번호에 해당하는 에러 메시지

획득 int strlen(const char *string) 스트링의 길이 획득

char* strncat

(const char *s1, const char *s2, size_t n)

s2 로부터 n 개의 문자를 s 에 추가

int strncmp

(const char *s1, const char *s2, size_t n)

두 스트링의 처음 n 개의 문자를 비교 , 두 문자열이 같으면 0, s1 이 크면 양수 , 아니면 음수를 return

char* strncpy

(char *s1, char *s2, size_t n)처음 n 개의 문자를 s2 에서 s1 로 복사

char* strrchr(char *s, int c)s 에서 문자 c 가 마지막으로 발견되는 위치 찾기

Page 61: 제 6 장 배열과 문자열

61/64YES C 제 6 장 배열과 문자열

예제 6.26 문자 배열을 이용하여 문자열을 저장하는 방법

• #include <stdio.h>

• void main(void)• {• static char name1[] = {'H','e','l','l','o'};• static char name2[] = "Hello";• printf("%s\n", name1);• printf("%s\n", name2);• }

• 실행결과 ( 첫 번째의 경우는 아래와 같이 나오지 않을 수도 있다 .)– Helloxghifghjkloqw30-=kl`'– Hello

Page 62: 제 6 장 배열과 문자열

62/64YES C 제 6 장 배열과 문자열

예제 6.27 문자 배열에 데이터를 저장하는 방법과 출력하는 방법

• #include <stdio.h>• #include <string.h>

• void main(void)• {• char word[20];

• strcpy( word, "Hi there." );• printf("%s\n", word );• }

• 실행결과– Hi there.

Page 63: 제 6 장 배열과 문자열

63/64YES C 제 6 장 배열과 문자열

예제 6.28 문자열 처리 함수를 이용한 프로그램이다 .

#include <stdio.h> #include <conio.h> #include <string.h> void main(void){    char a[30],b[30],pass[10],s1[15],s2[15]; printf("/*strcat()=string1+string 2 */\n\n");   printf("input string 1:"); gets(a);    printf("input string 2:"); gets(b);   printf("\n\n string1 + string2 = %s \n",

strcat(a,b));    printf("\n\n/* strcmp() = compare string1 with

string2 */ \n");    printf("\n\nif your password is....h6614 \n");

Page 64: 제 6 장 배열과 문자열

64/64YES C 제 6 장 배열과 문자열

예제 6.28( 계속 )

   do{       printf("Your Password : "); gets(pass);       if(strcmp(pass,"h6614"))            printf("invalid password\n");       else            break;    } while(1);

   printf("\n O.K");    getch();   printf("\n/*strcpy(s1,s2)=Copy s2 to s1*/ \n");

   printf("input string s2 :"); gets(s2);    strcpy(s1,s2);    printf("s1 = %s\n",s1);    getch(); }