상세 컨텐츠

본문 제목

Array

개발생활/C C++

by 한국인맛집 2021. 4. 13. 20:31

본문

반응형

배열

 

 

배열은 변수들의 나란히 줄지어 연속적으로 되어있다고 생각하시면 좋습니다.

 

변수는 선언하면 다음과 같이 형태를 가집니다.

 

배열을 선언하면 다음과 같이 형태를 가지게 됩니다.

 

배열의 타입은 사용자가 필요에따라 타입을 정할수 있습니다.

 

배열의 사용방법은 다음과같습니다.

 

int number[3];  // 배열의 선언

// 배열의 값초기화
number[0] = 1;
number[1] = 2;
number[2] = 3;


int numberArray[3] = {0,1,2};   // 선언과 동신에 초기화 초기화 1번째 방법

int nArray[] = {3,4,5};   // 선언과 동시에 초기화 2번째 방법
char charArray[] = "absc";  // 선언과 동시에 초기화

// charArray[0] = 'a';
// charArray[1] = 'b';
// charArray[2] = 's';
// charArray[3] = 'c';
// 값이 다음과같이 들어간다.

int multipleArray[1][2];  // 이중 배열 사용시

 

 

배열은 루프문을 이용하여 초기화가 가능합니다.

 

#include<stdio.h>

void main(){

    int arr[3];
    
    for(int i = 0; i< 3; i++){
    	arr[i] = i;
    }
    
    fgetc(stdin);


}

 

 

배열은 인덱스를 이용하여 직접 접근할수 있습니다.

배열의 출력은 다음과같습니다.

 

#include<stdio.h>

void main(){
   
   int arr[3];
   
   for(int i = 0; i< 3; i++){
      arr[i] = i;
   } 

   printf("0번 인덱스 ==> \n",arr[0]);
   printf("1번 인덱스 ==> \n",arr[1]);
   printf("2번 인덱스 ==> \n",arr[2]);

   fgetc(stdin);
}

 

 

루프문을 이용하여 선언과 동시에 출력이 가능합니다.

 

#include<stdio.h>

void main(){
   
   int arr[3];
   
   for(int i = 0; i< 3; i++){
      arr[i] = i;
   } 


   int index = 0;
   
   while(index < 3){
      printf("%d 번째 값 == >  %d\n",index,arr[index]);
   }

   fgetc(stdin);
}

 

 

배열자체의 사이즈를 가져오는 방법은

 

sizeof()를 사용하면 됩니다.

 

하지만 sizeof()는 크기를가져옵니다.

 

예를들어 배열을 다음과같이 선언했습니다.

 

int arr[3];

 

sizeof를 사용하면결과는 12 가 나오게됩니다.

 

배열의 크기가 아닌, 메모리 할당량이 나오게됩니다.

 

그럼 메모리 할당량으로 나누게 되면 배열의 사이즈를 얻을수 있습니다.

int arr[3];

printf("배열의 사이즈 ==  %d ,sizeof(arr)");
// 배열의 사이즈가 나오지않고 배열의 전체 크기를 출력한다.

// 배열의 전체크기를 알게됬으니, 할당한 타입으로 나누면
// 배열의 사이즈를 알수있다.
// 4byte  * 3  = 12
// 12 /4  = 3

printf("배열의 올바른 크기 >>> %d\n", sizeof(arr)/sizeof(int));

 


& 연산자

 

& 연산자를 여러분은 이제 친해져야합니다.

 

&연산자는 주소값을 리턴하는 연산자입니다.

 

#include<stdio.h>

void main(){


   int number = 10;
   
   printf("%d",&number);
   
   fgetc(stdin);
   

}

다음과 같이 출력하면 number변수가 할당된 메모리 값이 리턴되게됩니다.

 

배열에서 &연산자를 사용하는 경우는 직접 접근 할때만 사용합니다.

 

#include<stdio.h>

void main() {


    int n[3];

    // 배열이 시작되는 0번째 인덱스의 주소값을 출력
    printf("배열의 0번째 주소값 ==>%d\n", n);

    for (int i = 0; i < sizeof(n) /sizeof(int); i++) {
        printf("%d 번째 주소값 == > %d\n",i,&n[i]);
    }
    fgetc(stdin);
}

 

다음을 출력하는 0번째 인덱스값이 같은 메모리 값을 출력하는것을 볼수 있습니다. 

 

 

배열로 사용자 입력받기.

 

사용자 입력을 배열에 저장할수 있습니다.

 

다음과 같이 사용할수 있습니다.

 

아래와 같이 직접 접근하여 사용할수 있습니다.

#include<stdio.h>

void main() {


    int n[3];

    for (int i = 0; i < sizeof(n) /sizeof(int); i++) {
        fseek(stdin, 0, SEEK_END);
        scanf_s("%d", &n[i]);
        

        printf("\n입력값 >>%d ===>%d\n", i, n[i]);
    }
    fgetc(stdin);
}

 

 

직접접근을 하지않고 다음 방법과 같이 사용할수 있습니다.

 

#include<stdio.h>

void main() {


    int n[3];

    for (int i = 0; i < sizeof(n) /sizeof(int); i++) {
        fseek(stdin, 0, SEEK_END);
        scanf_s("%d", n+i);


        printf("\n입력값 >>%d ===>%d\n", i, n[i]);
    }
    fgetc(stdin);
}

 

이방법은 여러분이 포인터를 배우게 되면 이해할수 있습니다.

 

포인터에서 다음과같이 접근하여 값을 출력, 입력을 할수 있습니다.

 

 

 

 


배열과 포인터 관계

 

 

int number[10];

float floatNumber[10];

char charArray[10];

char* charPointer;

마지막줄에 포인터 변수가 있는걸 확인할수 있습니다.

 

 

포인터 변수도 곧 배열입니다.

 

왜 배열과 포인터와 같을까요?

 

아래 코드를 보시겠습니다.

 

#inlcude<cstdio>
#inlcude<cstdlib>

void main(){

	int numArray[3];
	
	printf("%d",numArray);
	fgetc(stdin);
}

 

배열의 인덱스로 직접 접근하는 것이아닌 배열 자체를 출력하게되면? 어떤값이 출력될까요?

 

이상한 값이 출력될것입니다.

 

하지만 이상한 값이 출력되는것이 아닌 배열의 첫번째 인덱스 즉 0번째 인덱스의 주소값을 출력하게됩니다.

 

 

 

배열역시 포인터 처럼 사용할수 있고, 포인터는 배열처럼 사용할수 있습니다.

 

☆ 포인터는 다음시간에 배우겠지만. 포인터는 변수의 타입입니다. 

 

자세한 내용은 포인터시간에 자세히 다루도록 하겠습니다.

 

포인터 = 배열

 

 


  배열의 특징

 

배열은 자료구조에서 가장빠른 자료구조입니다.

가장빠른 이유는 직접 접근 입니다.

 

배열의 값을 출력한다거나, 값을 넣는 과정은 배열의 인덱스를 통해 직접 접근 합니다. 그렇기때문에 자료구조에서 매우빠른 특징을 가지고 있습니다.

 

배열에는 가장큰 문제가 존재합니다.

 

1. 사이즈를 처음에 정한다면, 나중에 늘린다거나 사이즈를 줄일수 없는 문제를  가지고 있습니다.

2. 중간에 값을 지우려고 하면 뒤에 값들을 앞인덱스로 옮겨줘야합니다, 삽입 역시 값을 뒤로 옮겨주는 추가적인 작업을 필요로 합니다.

 

 

 

 

삽입역시 동일한 행동을 프로그래머가 해줘야합니다.

만약 옮기지않고 중간값만 비어있는상태를 만들수없습니다. 그러므로 모든 값들을 이동시켜줘야합니다.

 

 


문자열 처리

 

 

배열을 이용하면 사용자로부터 문자열을 입력받을수 있습니다.

 

입력할때 다음과 같이 사용할수 있습니다.

 

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

void main() {

	printf("안녕하세요 입력하세요!\n");
	char arr[10];

	fseek(stdin, 0, SEEK_END);
	scanf_s("%9[^\n]s", arr,sizeof(arr)/sizeof(char));

	printf("%s\n", arr);
	fgetc(stdin);
}

 

 

scanf 함수를보면 현재까지 사용한방법과 다른 형태를 나타내고 있다.

 

문자열을 입력받고자 할때 scanf_s함수 마지막에 특별한 내용을 써줘야한다.

 

스캔f_s 함수는 아래와 같이 구성되어있다.

 

scanf_s("포맷.",&[입력받는 변수], [최대 길이]);

 

 

포맷쪽 내용을 살펴보자.

 

포맷스타일 설명
%s 문자열
%9s 9개 문자만 입력받음 [문자열] 
%[^\n]s 입력받을때 공백도 문자열로 취급하여 입력받는다.
%9[^\n]s 9개 문자를 입력받고, 공백도 문자열로 취급받는다.

 

 

scanf_s의 마지막 부분인 최대길이에 대한 내용은 다음과 같다.

scanf를 사용하고 사용자가 의도한 사이즈보다 큰 값을 입력받으면 메모리 사이즈 에러를 발생하는데.

이것을 미리 코드 작성단에서 추가해, 사용자가 해당 배열보다 큰값을 입력해도 자동으로 무시처리 해주는 함수이다.

 

포맷부분은 배열의 사이즈에 맞게 포맷을 정해주어야한다.

 

배열의 사이즈가 10개 라고해서 포맷도 10으로 해주면 안된다. 배열의 사이즈가 10이라면 포맷은 9로 해줘야한다!

 

배열의사이즈가 n 이라면 포맷상은 n-1로 해줘야한다.

 

 

 


String.h

 

 string 헤더파일은 문자열을 관련한 내용을 담고 있다. 크게 4종류만 확인할 예정이다.

 

1. strcpy_s()

2. strcat_s()

3. strcmp()

4. strlen()

 

 

 

1. strcpy_s() 

 

 

strcpy_s()는 문자열 자체를 복사해주는 함수입니다.

 

예전엔 strcpy()함수를 사용했으나 strcpy역시 문자열의 취약점 때문에 몇가지 추가되었습니다.

 

 

함수의 구성

 

strcpy([복사 되는 배열및 포인터 ] , [복사 할 배열 및 포인터]);

strcpy_s([복사되는 배열및 포인터] , [복사 할 배열 및 포인터], 복사할 사이즈);

 

 

복사할 사이즈는 비워둘수 있다. 하지만 복사할 배열, 포인터가 복사될 배열 사이즈보다 클경우 사이즈를 지정해줘야한다.

 

 

 

 

 

사용법

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

void main() {

	char prevArray[10] = "hello\0";
	char copyArray[10];
	strcpy_s(copyArray, prevArray);
	printf("%s\n", copyArray);
	fgetc(stdin);
}

 

 

 

 

 

 

2. strcat_s()

 

strcmp는 배열이나 포인터맨뒤에 문자열을 추가할수 있다.

 

 

함수의 구성

 

strcmp([복사 되는 배열및 포인터 ] , 마지막에 추가할 문자열);

strcmp_s([복사되는 배열및 포인터] , [마지막에 추가되는 문자열], 복사할 사이즈);

 

 

사용법

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

void main() {

	char a[20] = "abcd";
	strcat_s(a, " efg",3);
	strcat_s(a, " hij",3);
	strcat_s(a," lmf",3);

	printf("%s ", a);


	fgetc(stdin);
}

 

 

 

 

 

 

3. strcmp()

 

 

문자열 두개를 비교하여 1, 0, -1 값을 출력한다.

 

1은 왼쪽이 문자열이 큰값,  

0 두문자열이 같음

-1 오른쪽 문자열이 큼.

 

 

 

 

문자열을 비교하는것은 ASCII코드값의 숫자값 즉 이진값으로 비교를 합니다.

 

아스키 코드는 아래 사이트에서 확인할 수있습니다.

 

www.ascii-code.com/

 

ASCII Code - The extended ASCII table

The following ASCII table with hex, octal, html, binary and decimal chart conversion contains both the ASCII control characters, ASCII printable characters and the extended ASCII character set Windows-1252.

www.ascii-code.com

 

 

 

함수의 구성

 

strcmp([문자열 A] , [문자열 B]);

 

 

사용법

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

void main() {

	char a[20] = "aaaa";

	char b[10] = "bbbb";

	int result = strcmp(a, b);


	if (result == 0) {
		printf("두 문자열은 같습니다.");
	}
	else if (result == 1) {
		printf("오른쪽 문자열이 큽니다.");
	}
	else if (result == -1) {
		printf("왼쪽 문자열이 큽니다.");
	}

	fgetc(stdin);
}

 

 

 

 

 

 

 

1. strlen()

 

strlen()함수는 해당 문자열의 길이를 가져옵니다.

 

 

 

함수의 구성

 

strlen([문자열이나 포인터]);

 

 

사용법

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

void main() {

	char str[20] = "hello world";


	int length = strlen(str);

	printf("string length = %d", length);

	fgetc(stdin);
}

 

 

 

그외 많은 내용이 있으나 알고싶으면 아래 사이트를 이용해보자.

 

www.cplusplus.com/reference/cstring/

 

(string.h) - C++ Reference

 

www.cplusplus.com

 

 

 


혼자 해보기 문제

 

 

 

1. 다음과같이 작동하도록 해라.

 

* char 형태 배열을 만들고 배열의 사이즈는 10으로 한다.

* 사용자로부터 a~c의 값을 입력받는다.

* 입력한 순서대로 값을 배열에 저장한다.

* 입력중에 a~c 가 아닌값이 입력이 들어오면 프로그램을 종료하고,

* 반복문을 사용하여 입력된 순서대로 배열을 출력하면된다.

* 입력을 배열사이즈보다 더 많이 받아선 안된다.

 

* 배열에 값을 넣는 AddData()함수를 만들어서 활용해라

* 배열의 값을 출력하는 printArray()함수를 만들어 활용해라.

* 배열의 사이즈는 매크로상수를 이용하도록 하고, 추후에 변경할수 있도록 한다.

 

 

 

 

 

 

 

 

2  출력할때는 빈값이 있으며면 출력되면 안된다.

 

배열의 사이즈만큼만 입력받아야한다.

 

 

 

 

 

 

 

반응형

'개발생활 > C C++' 카테고리의 다른 글

pointer-2  (0) 2021.04.13
Function / Header File  (0) 2021.04.13
Flow control [Conditional Statements]  (0) 2021.04.04
Loop- 2  (0) 2021.04.04
c/c++ Gitignore file  (0) 2021.03.30
Loop -1  (0) 2021.03.21

관련글 더보기