배열(array) - (3)

@Super_E끌림·2024년 6월 8일
post-thumbnail

⛅️오늘의 이야기

  • \0(종료문자) 넌 어디에 있니?

  • scanf("%c",&a)와 scanf("%c ",&a)

  • 또 다른 배열 정의 방법





📌들어가기 전에..

이번 내용은 저번 내용들의 심화(?) 내용들과

사소하면서 중요한 내용들을 적을려고 합니다.





💁🏻‍♂️ \0(종료문자) 넌 어디에 있니?

앞에서 말했듣이 정수형은 종료 문자가 없기 때문에 문자형으로 말하겠습니다.

그 중에서도 문자열로 입력받을 때를 생각해보겠습니다.

예제 1)

#include <stdio.h>

int main(){

	char arr[10] = "hellow";
    
    scanf("%s",&arr[6]);
    
    for(int i=0;i<8;i++){
    	printf("%c",arr[i]);
    }
    
    return 0;
}

입력 : !
출력 : hellow!

예제 2)

#include <stdio.h>

int main(){

	char arr[20] = "hello world!";
    
    scanf("%s",&arr[13]);
    
    for(int i=0;i<20;i++){
    	printf("%c",arr[i]);
    }
    
    return 0;
}

입력 :  !
출력 : hello world! !

  • 그럼 배열에는 어떻게 저장될까?

    1)

    2)

  • 입력할때

    예제 1)의 scanf로 입력받는 배열의 index가

    hello world!의 종료문자가 있는 index인데 그 뒤에 index로 밀려납니다.


    배열은 입력받고 남은 index에는 종료문자( \0 )으로 채워집니다.


  • 출력할때

    종료문자(\0) 전까지 출력한다라고 봐도 됩니다

    (---> 정확히는 종료문자 있는 index는 무시하고 출력합니다.)




💁🏻‍♂️ scanf("%c",&a)와 scanf("%c  ",&a)

이거 은근히 처음에 배울때 많이 틀리는 부분중에 하나입니다.


scanf("%c",&a);
scnaf("%c ",&a);

입력 상황시에 띄어쓰기가 있고 없고에 따라서 입력 방법이 달라집니다.


예제 1) 공백 X

#include <stdio.h>

int main(){
	char arr[5];
    
    for(int i=0;i<4;i++){
    	scanf("%c",&arr[i]);
    }
    
    printf("%s",arr);
}

  • 입출력 1)

    입력 : hunt
    출력 : hunt

  • 입출력 2)

    입력 : h
              u
    출력 : h
              u

  • 입출력 3)

    입력 : h u n t
    출력 : h u %


    이 퍼센트(%)는 공백 처리를 시각화 해주기 위해 쓰인 것이지 다른 의미는 없습니다.

    이때는 개행문자(공백, 엔터 등...)들이 문자로 인식!!!


예제 2) 공백 O

#include <stdio.h>

int main(){
	char arr[5];
    
    for(int i=0;i<4;i++){
    	scanf("%c ",&arr[i]);
    }
    
    printf("%s",arr);
}

  • 입출력 1)

    입력 : hunt
    출력 : hunt

  • 입출력 2)

    입력 : h
              u
              n
              t
    출력 : hunt

  • 입출력 3)

    입력 : h u   n    t
    출력 : hunt


    나도 공백 있는 입력은 이 내용을 쓰면서 알게 되었습니다.

    여기는 개행문자(엔터, 공백 등..)이 배열에 저장되지 않는다!!




💁🏻‍♂️ 또 다른 배열 정의 방법

우리가 배열을 정의할때 일반적으로는

배열의 크기를 상수로

char arr[6];
int arr[8];

직접 지정해주지만

입력을 통해 배열의 크기를 지정해줄 수 있습니다.

int n;

scanf("%d", &n);

char arr[n];
int arr[n];

하지만 이때 배열의 크기를 의미하는 'n'은 건들면 안됩니다.

배열은 기본적으로 한번 지정해주면 끝이기 때문에 n을 바꾸는 순간 에러가 발생합니다.

그리고 이런 배열의 정의는 프로그램에 따라서 사용할 수 있고 사용하지 못할 수 도 있습니다.


그래서 이러한 불편함을 없애기 위해서 동적 할당이라는 방법을 사용합니다.



배열 동적 할당

동적 할당 쓰는 이유가 효율적인 메모리 사용을 위해서라

직접적으로 메모리에 접근해 작업하여

포인터 형식으로 써야 됩니다.



  • 일차원 배열 동적할당

    int n;
     scanf("%d",&n);
     
     // 문자형 1차원 배열 동적 할당
     char *arr = (char*)malloc(sizeof(char)*n);
     
     // 정수형 1차원 배열 동적 할당
     int *arr = (int*)malloc(sizeof(int)*n);


  • 2차원 배열 동적 할당

    int x,y;
     scanf("%d %d",&x,&y);
     
     // 문자형 2차원 배열 동적 할당
     char **arr = (char**)malloc(sizeof(char)*y);
     
     for (int i=0;i<x;i++)
     	arr[i] = (char*)malloc(sizeof(char)*x);
     
     // 정수형 2차원 배열 동적 할당
     int **arr = (int**)malloc(sizeof(int)*y);
     
     for (int i=0;i<x;i++)
     	arr[i] = (char*)malloc(sizeof(char)*x);

자세한 내용은 아래 내용 참고!!!

동적 할당 참고 자료






🫧마무리

배열 시리즈를 마무리 하며 배열의 크기를 입력할때 자료형에 따른 종료문자( \0 )를 생각하여 입력하기!!!











➡️ Maybe Next 시리즈 : 컴퓨터 과학?



profile
SoC:) SoC:)

1개의 댓글

comment-user-thumbnail
2024년 6월 8일

🥰

답글 달기