C 언어 - 배열과 문자열

컴퓨터/C

728x90
반응형

배열과 문정의와 필요성

C언어를 사용하면서 변수를 메모리 공간에 선언하여 변수를 가지고 값을 계속 변경을 할수 있다고 했습니다. 만약 숫자를 담는 int형 변수 30개가 필요하다고 가정해 봅시다. 일일이 변수로 선언을 하고 이 변수들을 제어하기는 어렵습니다. 

int num1;
int num2;
int num3;
int num4;
int .....

이런 변수의 한계점을 극복하기 위해 나온것이 바로 배열입니다. 배열을 통해 문장을 저장하고 숫자들을 묶어서 저장할 수 있습니다.

 

배열

배열은 변수의 묶음의 형태 입니다. 

int형 변수 5개를 만드는 대신 int형 변수 5개를 묶을수 있는 배열을 만들어서 사용하게 되는 것입니다. 배열을 만들면 그림과 같이 배열의 이름은 arr이고 대괄호 []로 배열의 인덱스(순서)값으로 접근할수 있습니다.

 

배열의 선언과 초기화

 

C언어에서 배열을 선언하기 위해서는 아래와 같습니다.

자료형 배열명[크기];
자료형 배열명[크기] = {0,};
자료형 배열명[3] = { 1,2,3};
  • 변수의 선언과 방식은 같으나 변수의 묶음을 표현하기 위해 대괄호 [ ] 를 사용한다.
  • 대괄호 [ ] 안에는 배열의 크기를 지정해 줄수 있다. 배열을 선언하는 크기는 반드시 상수 값이여야 한다.
  • 선언과 동시에 초기화를 하기 위해서는 중괄호{ } 와 각 인덱스를 표시하기 위한 , 로 구분하여 초기화를 할수 있다.
  • { 0 , } 은 모든 인덱스의 값을 0으로 초기화 하겠다는 의미이다.
  • 만약 배열을 3의 크기로 선언을 했다면 배열의 인덱스는 0부터 2까지 즉 배열[0],배열[1],배열[2]가 된다.   

예제 1 ) 배열 선언하여 각 값에 접근해 보기 

#include <stdio.h>


int main()
{
    int a = 5;
    //int arr[a] = { 1,2,3,4,5 }; error 발생 반드시 상수 값만 
    int arr_a[5] = { 0, };
    int arr_b[5] = { 1,2,3,4,5 };
    for (int i = 0; i < 5 ; i++)
    {
        printf("arr_a[%d]의 값은 : %d \n", i,arr_a[i]);
    }
    for (int i = 0; i < 5 ; i++)
    {
        printf("arr_b[%d]의 값은 : %d \n", i,arr_b[i]);
    }
    return 0;
}

결과보기

더보기

원하는 대로 초기화 된것을 확인 할 수 있다. 

예제 1과같이 배열을 사용하면 반복문과 배열을 이용해서 많은 변수들을 손쉽게 제어할수 있습니다.

 

예제 2 ) 100개 크기의 int형 배열을 만들고 모두 100의 값으로 초기화 하세요

#include <stdio.h>
int main()
{
    int arr[100];

    for (int i = 0; i < 100; i++)
    {
        arr[i] = 100;
    }
    return 0;
}

에제 1을 응용하면 특정 숫자로 초기화 또한 가능하다.

 

문자열 배열

배열을 알아봤으니 char형 변수의 묶음의 형태로 배열을 선언하면 우리는 문자가 아닌 문자열 즉 문장을 저장할수 있습니다. 하지만 C언어에서 배열의 형태로 문자들을 저장하게 되면 몇가지 특징이 있습니다. 본문에서는 문자열 배열에 대하여 조금더 알아보고 문자를 저장해보도록 하겠습니다.

 

예제 1)char형 변수에 문자를 집어 넣어 봅시다.

C 언어에서 문자를 집어 넣기 위해서는 ' '로 범위를 지정하여 넣어야만 합니다.

#include <stdio.h>

int main()
{
	// char a = "A"; error 발생! 
    char a = 'A';
    printf("%c", a);
    return 0;
}

문자를 저장하기 위해서 우리는 ' ' 를 사용합니다. 그러면 문자열 배열을 선언하면 어떻게 사용해야 될까요 ?

 

예제 2) 문자열 배열의 선언과 초기화 

#include <stdio.h>


int main()
{
    char a[10] = "Hello";
    char b[10] = { 'H','e','l','l','o' };
    printf("%s\n", a);
    printf("%s\n", b);
    return 0;
}
  • 문자열 배열을 선언하고 초기화를 할 때는 2가지 방법이 있습니다.
    • char a 처럼 " " 로 문장을 저장한다.
    • char b 처럼 중괄호 { } 와 각각의 인덱스에 문자를 저장한다.  
  • 출력을 하기 위해서는 서식문자 %s를 이용한다 
  • 여기서 일반 배열과 다른점은 바로 배열의 인덱스를 표시하지 않고 배열의 이름만 선택하면 저장된 문자가 나온다는 것 입니다.(이부분에 대해선 추후에 좀더 자세히 다루겠습니다. 지금은 전체를 출력하기 위해서는 문자열 배열의 이름과 서식지정자 %s를 사용한다만 알아주세요)

근데 우리는 char형 변수 10개의 묶음의 배열을 만들었습니다. 그렇다면 Hello는 5개의 문자입니다. 이후의 배열의 공간은 어떻게 되는건지 한번 알아볼까요?

 

예제3) 문자열 배열의 전체 출력

#include <stdio.h>
int main()
{
    char a[10] = "Hello";

    for (int i = 0; i < 10; i++)
    {
        printf("%c", a[i]);
    }

    return 0;
}

출력은 똑같습니다. 하지만 실제 메모리 공간에서는 약간의 차이가 있습니다. 콘솔창에서는 보이지 않지만 NULL문자가 입력이 되있습니다. NULL문자는 눈에 보이지 않지만 그 메모리 공간에는 '\0'이 들어가 있습니다. 그림으로 한번 보겠습니다.

예제4) 문자열 배열에서 NULL 문자의 필요성

 

NULL문자는 문자열 배열의 마지막을 알려주는 역할을 합니다. 따라서 내가 넣고싶은 문자의 수보다 하나 더 많은 문자열 배열이 필요합니다. 문자의 끝을 알수 없으면 알수없는 출력이 나올수도 있기 때문이죠. 

#include <stdio.h>


int main()
{
    char a[10] = "0123456789";
    //scanf_s("%s", a);
    //printf("%d", sizeof(a));
    printf("%s", a);


    return 0;
}

문자열 배열 a에 char 10개를 할당하고 문자를 0부터 9 까지 총 10개를 넣었습니다. 그리고 출력을 해봤습니다.

생각했던 값과는 다른 결과가 나옵니다 바로 문자열의 끝을 알리는 NULL문자의 부제로 인해서 입니다. 

 

예제5) 문자열 배열의 수정

문자열 배열이 선언된 후에 수정을 하려면 번거로울수 있는 단점이 있습니다. Hello 에서 World로 변경을 해보겠습니다.

#include <stdio.h>
int main()
{
    char a[10] = "Hello";

    // a = "World"; error 발생

    printf("%s\n", a);

    a[0] = 'W';
    a[1] = 'o';
    a[2] = 'r';
    a[3] = 'l';
    a[4] = 'd';

    printf("%s\n", a);
    return 0;
}

선언과 동시에 초기화를 할 경우 " " 를 이용하여 문장을 넣을 수 있지만 지금까지 배운 내용에서는 선언 후에는 각각의 인덱스에 접근할수 밖에 없기 때문에 문자를 하나씩 집어 넣어 주어야 합니다.

 

예제6) 문자열 배열의 입력

이번에는 문자열 배열안에 입력을 하는 방법에 대하여 알아보겠습니다.

#include <stdio.h>


int main()
{
    char a[10] ;
    printf("원하는 문장을 입력하세요 (9자 이내) : ");
    scanf_s("%s", a);  //Hello입력 
    printf("%s\n", a);
    return 0;
}

scanf와 %s를 통해 입력을 할수 있습니다. 하지만 주의할 점이 몇가지 있어 알아보겠습니다.

 

예제7) 문자열 배열 입력 주의사항 1 - 문자열 배열의 크기를 넘지 말것

#include <stdio.h>

int main()
{
    char a[10] ;
    printf("원하는 문장을 입력하세요 (9자 이내) : ");
    scanf_s("%s", a);  // 9자가 넘는 문자를 입력하면 위험
    printf("%s\n", a);
    return 0;
}

9자가 넘는 문자를 입력하면 사용중인 메모리 공간을 쓸수 있기 때문에 위험합니다.  어떤 컴파일러에서는 가능할수 있지만 지양해야 됩니다.

 

예제8) 문자열 배열 입력 주의사항 2 - 문자열 배열의 크기를 넘지 말것공백 문자 

scanf 함수의 특성상 공백 또는 엔터가 들어가면 입력이 끝나는 것으로 인식합니다. 따라서 공백문자를 입력하려면 추가적인 방법을 사용해야 됩니다.

#include <stdio.h>

int main()
{
    char a[10] ;
    printf("원하는 문장을 입력하세요 (9자 이내) : ");
    scanf_s("%s", a);  // Hello world 
    printf("%s\n", a); // Hello 만 출력됨
    return 0;
}

%[^\n]s 사용

#include <stdio.h>

int main()
{
    char a[10] ;
    printf("원하는 문장을 입력하세요 (9자 이내) : ");
    scanf_s("%[^\n]s", a); // 공백 문자를 포함하기 위한 기능 %[^\n]s 서식 지정자 사용
    printf("%s\n", a); 

    return 0;
}

 

변수들의 묶음인 배열에 대해서 알아보고 문자열 배열의 특성에 대해서 알아보는 시간을 가져봤습니다. 

728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - 포인터 / 포인터 변수  (0) 2021.06.13
C 언어 - 메모리주소  (0) 2021.06.12
C 언어 - 지역변수와 전역변수  (0) 2021.06.08
C 언어 - 용어 알아보기  (0) 2021.06.08
C 언어 - 함수  (0) 2021.06.06

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :