본문 바로가기

2023/C

배열 기반의 문자열 표현

[배열기반의 문자열 표현]

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {
   
    char str[50];
    int idx = 0;

    printf("문자열 입력 : ");
    scanf("%s", str);
    printf("입력 받은 문자열 : %s\n", str);

    printf("문자 단위 출력 : ");
    while (str[idx] != '\0')
    {
        printf("%c", str[idx]);
        idx++;
    }
    printf("\n");

    return 0;
}

위의 코드를 실행할 때 문자열  Hello World!를 입력하면 

위와 같이 Hello까지만 입력받을 수 있다.

왜 공백 문자 뒤에 있는 World!는 입력받지 못하는 것일까?

Hello 바로 뒤에는 공백문자(널 문자와 다름!!!)인데 왜 널 문자가 온 것처럼 결과가 출력되는 것일까?

 

입력된 문자열이 공백을 포함하여 중간에 종료되는 이유는 scanf 함수의 작동 방식 때문이다. scanf 함수는 기본적으로 공백 문자(스페이스, 탭, 개행 문자 등)을 구분자로 사용하여 입력을 분리한다. 그래서 scanf 함수로 문자열을 입력받을 때 공백 문자를 포함하면, 공백 문자가 구분자로 작용하여 문자열 입력이 공백 이전까지만 처리되는 것이다.

 

예를 들어, "Hello World"라는 문자열을 입력하면 scanf 함수는 "Hello"까지만을 읽어서 str 변수에 저장하고, "World" 부분은 다음 입력까지 남겨둔다. 따라서 이 코드에서 printf("입력 받은 문자열 : %s\n", str);를 실행하면 "Hello"만 출력된다.

 

[참고 1] 널 문자('\0')공백 문자( )는 다르다!

* 널 문자의 아스키 코드 값 : 0

-> 이를 문자의 형태로 출력할 경우, 아무런 출력이 발생하지 않는다.

 

* 공백 문자의 아스키 코드 값 : 32

->  이를 문자의 형태로 출력할 경우 빈 칸(공백, '  ')이 출력된다.

 

 

[참고 2] scanf 함수를 이용한 문자열의 입력

1. "scanf 함수 호출을 통해서 입력 받은 문자열의 끝에도 널 문자가 삽입되어 있다."

2. 배열의 저장되는 문자열뿐 아니라, C언어에서 표현하는 모든 문자열의 끝에는 널 문자가 자동으로 삽입된다.

3. 널 문자가 존재하면 문자열이고 널 문자가 존재하지 않으면 문자열이 아니다.

=> 문자열의 판단여부에 있어서 선언방법은 중요하지 않다.

=> 어떻게 선언이 되든 널 문자가 마지막에 존재하면 이는 C언어의 관점에서 문자열이 된다.

 

[참고 3] 문자열의 끝에 '널(null)' 문자가 필요한 이유

=> 문자열의 끝을 나타내기 위한 장치의 필요성

 

메모리 상에서 문자열은 이진 데이터로 저장되기 때문에 문자열의 시작과 끝이 표시되어 있지 않다면 문자열을 구분하는 것은 불가능하다. 그래서 널 문자를 이용해서 문자열의 끝을 표시한다.

 

마찬가지로, printf 함수도 %s를 기반으로 문자열의 출력을 명령하면 문자열의 끝에 널 문자가 삽입되어 있다는 전제로 문자열을 구분하여 출력한다.

 

 

 

 

 

-윤성우 저 열혈강의 C 프로그래밍 참고-

'2023 > C' 카테고리의 다른 글

포인터 대상의 const 선언  (0) 2023.10.09
포인터와 배열, 포인터 연산  (0) 2023.10.08