컴퓨터/C
C언어를 사용하면서 변수를 메모리 공간에 선언하여 변수를 가지고 값을 계속 변경을 할수 있다고 했습니다. 만약 숫자를 담는 int형 변수 30개가 필요하다고 가정해 봅시다. 일일이 변수로 선언을 하고 이 변수들을 제어하기는 어렵습니다.
int num1;
int num2;
int num3;
int num4;
int .....
이런 변수의 한계점을 극복하기 위해 나온것이 바로 배열입니다. 배열을 통해 문장을 저장하고 숫자들을 묶어서 저장할 수 있습니다.
배열은 변수의 묶음의 형태 입니다.
int형 변수 5개를 만드는 대신 int형 변수 5개를 묶을수 있는 배열을 만들어서 사용하게 되는 것입니다. 배열을 만들면 그림과 같이 배열의 이름은 arr이고 대괄호 []로 배열의 인덱스(순서)값으로 접근할수 있습니다.
배열의 선언과 초기화
C언어에서 배열을 선언하기 위해서는 아래와 같습니다.
자료형 배열명[크기]; |
자료형 배열명[크기] = {0,}; |
자료형 배열명[3] = { 1,2,3}; |
예제 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;
}
근데 우리는 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;
}
변수들의 묶음인 배열에 대해서 알아보고 문자열 배열의 특성에 대해서 알아보는 시간을 가져봤습니다.
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 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet