ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 문자(배)열 과 gets, puts (문자열 I/O 함수) 함수
    C언어 2020. 2. 18. 08:02

    이번 포스트에서는 문자열과 콘솔을 통해 이루어지는 문자열을 입, 출력해주는 함수에 대해서 알아볼 것이다. 

    이전 포스트에서 말했다시피 문자열을 하나의 인스턴스로 착각하는 경우가 있는데 문자열은 여러 인스턴스들의 연접한 집합으로 문자들의 배열이라고 본다. 따라서 배열을 식별함에 있어서 주소를 통해서 식별을 하게 되는데 이때 주소는 해당 배열의 가장 첫 번째 인스턴스의 주소에 이름이라는 식별자를 부여해 배열을 식별한다. " 나부터 배열이 시작돼 라고 알려주는 것 " 즉 배열은 이름이라는 식별자를 통해 식별하게 되고 이름은 해당 배열의 가장 첫 번째 인스턴스의 주소를 가리킨다 따라서 결국은 주소를 통해 배열을 식별한다 라고 볼 수 있다. 또한 주소의 개념이 나오다 보니 주소에 대한 정보를 담는 변수인 포인터의 개념이 등장한다. 

    문자열은 배열이고 배열은 주소로써 식별되고 이런 주소를 관리하는 공간인 포인터라는 개념이 등장한다. 따라서 문자열을 이해하기 위해서는 포인터의 개념을 이해할 필요가 있다. 

    예를 들어 철수라는 친구가 쌀심부름을 받아서 마켓을가서 쌀을 사와야 한다고 했을 때 마켓에서 배송을 하기 위해서는 철수의 집이 어딘지 알아야할 필요가 있다. 이때 철수집 이라는 식별자 (이름), 경기도 ㅇㅇ시 ㅇㅇ읍 (주소), 쌀 40Kg (정보) 의 정보를 통해 배송을 보내게 되는데 이때 배송자는 주소의 정보를 통해 배달을 하게 될 것이다. 컴퓨터가 정보를 처리할 때 역시 상대적으로 큰 정보들은 (자료형 1개로 처리가 안되는 것) 주소정보를 통해 자료를 처리하게 된다. 

     

    문자열 입출력 함수 (gets, puts)

    위에서 설명했듯이 큰 정보 (자료형 1개로 처리가 안되는 것) 즉 문자열의 경우에도 배열에 속하기 때문에 해당 배열의 주소정보를 통해 입출력을 수행하게 된다. 따라서 문자열 입출력 함수를 호출 할때 인자값으로 배열의 주소를 넣어 주어야 해당 함수는 콘솔을 통해 입력받은 자료를 반환하여 인자값으로 넘겨준 배열의 주소의 메모리에 정보를 넣어주게 된다. gets 함수가 수행하는 일은 다음과 같다.

    사용자에게 입력 값을 받으면 함수는 버퍼에 입력값을 일시적으로 담아 두었다 반환 값으로 다시 돌려 준다. 이때 함수를 호출할 때 인자값으로 넘겨주었던 문자열의 주소정보가 가르키는 메모리에 반환 값을 차례대로 저장하게 된다.

    위와 같이 ch1 문자열을 선언한 뒤 gets_s 함수를 호출하여 인자값으로 변수명, 변수의 크기에 대한 정보를 알려주었다.

    위와 같이 성공적으로 ch1 배열에 0으로 초기화가 되는 것을 볼수 있다.

    다음으로 콘솔창에 입력값으로 TEST 그리고 엔터 정보를 입력하면 내부적으로 gets_s 함수는 입력된 정보를 버퍼에 일시적으로 담아둔 뒤 엔터키 전의 값들을 인자값으로 넘겨준 ch1 문자열의 주소가 가르키는 메모리에 위와 같이 저장해 주는 것을 볼수 있다.

    'C언어' 카테고리의 다른 글

    연산자 (sizeof), 디스어셈블  (0) 2020.02.24
    정수의 입력 함수 (scanf), 버퍼의 추상화  (0) 2020.02.19
    getchar 함수와 동작 원리 (버퍼링)  (0) 2020.02.16
    표준 O/I (getchar, putchar)  (0) 2020.02.16
    C언어 표준 O/I  (0) 2020.02.16

    댓글

Designed by Tistory.