본문 바로가기

Development/C++

2차원 배열과 포인터배열(2차원 문자배열)

이번에는 여러 개의 문자열을 처리하기 위한 2차원의 문자배열을 살펴볼거에요.

하나의 문자열을 저장하기 위해서는 하나의 문자배열이 필요해요.

따라서 많은 문자열을 저장하기 위해서는 2차원의 문자배열을 사용해야 할 거에요.

 

 

각 행이 하나의 문자열을 저장한다

 

5개의 동물이름을 저장할 2차원의문자배열을 선언하고 문자열들을 저장해 봅시다.

5개의 문자열을 저장해야 하므로 행의 수는 다섯 개이며

열의 수는 가장 긴 문자열도 저장될 수 있도록 넉넉하게 선언하면 될 거에요.

물론 널문자까지 포함시켜야 하구요.

 

char animal[5][20];                    // 5개의 문자열을 저장할 2차원 문자배열

 

animal 문자배열을 선언하면 다음과 같이 100개의 char형 기억공간이 할당될 거에요.

 

 

여기서 각 행은 하나의 1차원 문자배열이며 부분배열명이 각 부분배열의 이름이 되요.

따라서 부분배열명을 사용하여 각 부분배열에 문자열을 입력 받을 수 있는 거죠.

우선 마지막 부분배열에 문자열을 입력 받아 볼게요.

 

 

animal[4]는 1차원 문자배열에서 배열명과 같은 것이므로 부분배열의 시작위치값이에요.

따라서 앞에 '&'를 붙일 필요가 없는 거죠.

표현방식이 1차원 배열에서 배열요소를 참조하는 형태이므로 자칫 하나의 변수로 오해할 수 있으나 

2차원 배열에서는 부분배열명이 된다는 것을 반드시 기억하고 있어야 해요.

 

이제 반복문을 사용하여 모든 부분배열에 문자열을 입력 받아 볼게요.

 

char animal[5][20];                                 // 2차원 문자배열의 선언

int i;                                                       // 반복 제어변수

 

for(i=0; i<5; i++){                                     // i는 0부터 4까지 4번 반복

printf("문자열을 입력하세요 : ");      // 입력 안내 메시지

scanf("%s", animal[i]);                   // i의 값이 변하면서 각 부분배열명이 된다.

 

}

 

 

2차원 문자배열의 초기화

 

 

이제 2차원 문자배열을 초기화하는 방법을 생각해 볼게요.

2차원 문자배열이 주로 여러 개의 문자열을 처리하기 위해 사용되지만

그 자체는 char형 기억공간들의 집합이므로 기본적으로 각 기억공간들을 문자상수로 초기화 할 수 있어요.

 

 

그러나 문자를 일일이 초기화하는 방법은 보기만 해도.......참....^^;

따라서 2차원 배열도 1차원 배열과 같이 문자열상수로 직접 초기화하는 방법을 사용해요.

2차원 배열은 논리적으로 부분배열을 하나씩 배열요소로 가지므로 

문자열상수를 각 부분배열의 초기값으로 사용할 수 있어요.

 




2차원 문자배열을 초기화할 때도 숫자배열과 마찬가지로 행 첨자를 하나 생략할 수 있어요.

물론 초기화 되는 문자열상수의 개수가 행의 수가 될 거구요.

 

자, 그럼 한 행의 길이가 10바이트(10)인 2차원 문자배열을 초기화하고 

반복문을 사용하여 저장된 문자열을 출력하는 예를 살펴 볼게요.

 

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     char animal[][10]={"monkey""elephant""dog""sheep""pig",
  6.                         "lion""tiger""puma""turtle""fox"};
  7.                                 // 2차원 문자배열의 선언과 초기화
  8.     int i;                      // 반복 제어변수
  9.     int count;                  // 문자열의 개수를 저장할 변수
  10.  
  11.     count=sizeof(animal)/sizeof(animal[0]);        // 초기화된 문자열의 수 계산
  12.     for(i=0; i<count; i++){                        // 그 개수만큼 반복한다
  13.         printf("%s ", animal[i]);                  // 저장된 문자열 출력
  14.     }
  15.     return 0;
  16. }


5번 줄은 2차원 문자배열을 선언하고 문자열상수로 초기화하는 문장이에요.

이때 행 첨자를 생략했으므로 문자열의 길이가 10자(널문자 포함)를 넘지 않는다면

원하는 만큼의 초기화가 가능할 거에요.

 

11번 줄은 초기화 된 문자열의 개수(행의 수, 부분배열의 수)를 구하는 문장입니다.

이 개수에 따라 문자열을 출력하는 횟수를 결정하면 될 거에요.

문자열의 개수는 부분배열의 개수이므로 전체 배열의 크기를 부분배열 하나의 크기로 나누면 구할 수 있어요.

 

              sizeof(animal) / sizeof(animal[0])
             전체 배열의 크기     부분배열 하나의 크기

 

이과 같이 반복 횟수를 계산에 의해서 결정하면 나중에 초기값에 변화가 생기더라도

프로그램을 크게 수정할 일은 없을 거에요.

 

연습문제 하나 풀고 이번 포스팅을 마무리 할께요.

 

 

 

  1. #include <stdio.h>               
  2. #include <string.h>                        // 문자열 처리함수를 위한 헤더파일
  3.  
  4. int main()
  5. {
  6.     char animal[][10]={"monkey""elephant""dog""sheep""pig",     // 배열의 선언과 초기화
  7.                         "lion""tiger""puma""turtle""fox"};
  8.     int i;                             // 반복 제어변수
  9.     int count;                         // 문자열의 개수를 저장할 변수
  10.     int total;                         // 배열의 전체 크기를 저장할 변수
  11.     int stored=0;                      // 문자열이 저장된 크기를 저장할 변수
  12.     double waste;                      // 낭비되는 공간의 크기를 저장할 변수
  13.  
  14.     total=sizeof(animal);                     // 배열 전체의 크기 계산
  15.     count=sizeof(animal)/sizeof(animal[0]);   // 전체 크기를 한 행의 크기로 나누면
  16.                                               // 문자열의 개수를 구할 수 있다.
  17.     for(i=0; i<count; i++){               // 문자열의 개수만큼 반복
  18.         printf("%s ", animal[i]);         // 문자열 출력
  19.         stored += (strlen(animal[i])+1);  //문자열의 길이를 계산하여 누적, 
  20.                                           //이때 널문자까지 포함해야 한다.
  21.     }                                                   
  22.  
  23.     waste=total-stored;                              // 낭비되는 기억공간 계산
  24.     printf("낭비되는 기억공간의 비율 : %.2lf%% ", waste/total*100 );                                                                                 // 낭비되는 비율을 계산하여 출력한다.
  25.  
  26.     return 0;
  27. }


 

낭비되는 기억공간을 계산하라는 문제이므로

전체기억공간을 구하고 사용한 문자열의 길이구하여

전체기억공간에서 사용한 문자열의 길이를 빼면 낭비되는 기억공간이 나올거에요.

 

우선... 2번 줄에서 string.h 헤더파일을 선언한 이유는

19번 줄을 보시면 문자열의 길이를 계산하는 strlen함수를 사용하기 때문이에요.

 

14번 줄에서 sizeof함수로 우선 animal 2차 배열 전체의 크기를 계산하고

 

15번 줄에서 전체 크기를 한 행의 크기로 나누어 문자열의 개수를 구해요.

 

17번 줄에서 구해놓은 문자열의 개수만큼 for문을 이용하여 반복하여

문자열을 출력하고

 

19번 줄에서 strlen함수를 이용하여 각 문자열의 길이를 계산하여 누적해요.

여기서 +1을 한 이유는 strlen함수는 널문자를 포함하지 않기 때문이에요.

기억공간에는 널문자도 공간을 차지하잖아요.

 

23번 줄에서 낭비되는 기억공간을 계산하여 구하면 됩니다.

 

 

 

 

 

 

 

 

 

https://archive.ph/iw8kc

https://m.blog.naver.com/1stwook/30182859109

 

2차원 배열과 포인터배열(2차원 문자배열)

이번에는 여러 개의 문자열을 처리하기 위한 2차원의 문자배열을 살펴볼거에요. 하나의 문자열을 저장하기 ...

blog.naver.com