문자열 입출력 함수


 

문자열은 여러 개의 문자가 차례로 나열된 것을 말한다.

‘T’는 영문 한 글자이지만 

‘TEST’는 영문 한 글자들이 이어진 문자열이다.


영문 1글자는 1바이트 메모리에 저장이 가능하지만, 

‘TEST’인 영문 4글자라는 문자열을 저장하려면 

적어도 4바이트 이상의 메모리가 필요하다.

따라서 자료형이 char형인 변수가 적어도 4개는 있어야 한다

char의 자료형은 1바이트 메모리 크기를 가지고 있기 때문이다.


ch라는 변수를 숫자를 붙여가면서 

4개를 표현하면 ch1, ch2, ch3, ch4 

이런식의 코드도 가능하지만

배열이란 것을 사용하면 더 간단하게 코드를 표현할 수 있다.

 

배열은 동일한 자료형의 변수 여러 개를 

한 묶음으로 사용하는 문법이다.


‘TEST’라는 char형 변수 4개를 선언하는 코드는 

“char ch[4];”라고 선언을 하면

자료형이 char인 변수 4개가 선언이 되고 

메모리 4바이트가 확보가 된다.


이 배열이 만약에 ‘ch라는 변수(식별자)’의 메모리의 

주소가 ‘0x0000FF60‘이라면

이 주소의 메모리에 ‘T’라는 문자가 저장되고 

바로 다음 주소인 '0x0000FF61'‘E’라는 문자가 저장되는 식으로

식별자의 메모리 주소부터 시작하여 차례대로 입력된 정보가 저장되는 것이다.

 

그리고 C언어에서 문자열의 끝은 널(null)이고 null‘0’이다

그래서 모든 문자열은 '0'으로 끝난다.


따라서 사용자가 ‘TEST’라는 문자열 입력하면 

문자열의 끝에 ‘0’이 붙어 있다고 생각하면 되고

이때 ‘0’1바이트 정수이다.


따라서 ‘TEST’라는 문자열의 배열을 사용하기 위해서는

자료형이 char형인 변수가 최소 5개가 확보되어야 되고,

이 말은 최소 5바이트 이상의 메모리가 확보되어야 된다는 말이다.


따라서 ‘TEST’라는 문자열을 입력받기 위해서는 

“char ch[5];”이렇게 코드를 작성하고 

이것이 실행되면 메모리가 5바이트 확보가 되며 

문자열을 입력받을 때 ‘TEST’라고 입력하면

식별자의 메모리 주소부터 시작하여 1바이트마다 

‘T, E, S, T, 0'이라는 문자가 저장되는 것이다.


 

예를 들어 자료형이 char인 변수 ch의 주소가 

위에 적은대로 '0x0000FF60’이라면


0x0000FF60 : T

0x0000FF61 : E

0x0000FF62 : S

0x0000FF63 : T

0x0000FF64 : 0


이런식으로 저장이 된다.

 


char Name[4] = {“ABC”};

이렇게 선언했다고 하면 확보한 4바이트의 메모리에 

1바이트 메모리마다 A, B, C, 0 이렇게 저장이 되고,

이때 저장된 A의 메모리 주소

(16진수, 예컨대 0x0000FF60)Name라는 배열의 이름이 부여된다.

배열을 선언하면서 4개의 변수(인스턴스)가 확보되었는데 

배열의 이름은 하나이므로 확보된 4개의 메모리 중에서 

대표되는 처음 시작되는 메모리의 주소에 배열의 이름을 부여하는 것이다.




* 참고 *

  

개념(이론, 형식) 사실(실제화)

인스턴스 : 개념 or 형식의 실질적 사례 or 실제사례. 변수라고도 함

물론 개념이 터무니없고 형식에 어긋나면 인스턴스화가 되지 않을 것이다


ex) 한글이라는 프로그램은 하나지만 여러 개를 실행할 수 있는데 

그 각각을 인스턴스라 한다


각각 실행된 것을 한글프로그램의 인스턴스이다 라고도 표현할 수 있음


“int a;” ‘a’int형에 대한 인스턴스(변수)이다.

 


배열은 여러 인스턴스의 집합체



배열의 이름은 주소에 붙고 그 주소로 식별되며 

배열의 주소는 포인터에 담긴다






** 잘못알고 있는 것이 있으면 댓글로 알려주시면 감사하겠습니다! **

_getch / _getche

_getch : getchar함수는 문자나 문자열을 입력받아 

버퍼에 저장한 후에 한 문자씩 꺼내서 반환하지만 

_getch함수는 버퍼에 입력받은 문자나 문자열을 

저장하지 않는 non I/O buffer 함수이므로 

문자 하나만을 입력받는다.

 

_getche : eecho의 의미

_getch와 기능은 대부분 동일하지만 다른 점은 

입력한 키보드의 값을 화면에 출력하는지의 여부.

 


char ch;

ch = _getch();

putchar(ch);

 

_getch함수가 표준입력장치로부터 

한 문자를 입력받게 되면 그 문자를 

버퍼에 저장하지 않고 반환하게 된다.

그 반환한 문자를 ch라는 변수에 대입한다

하지만 사용자가 입력한 키보드의 값을 화면에 출력하지 않는다.


_getche함수의 경우 사용자가 입력한 키보드의 값을

화면에 출력하게 된다는 점을 제외하면 

_getch함수와 동일하다.


putchar함수에 의해서 ch에 대입된 문자가 

콘솔화면에 표시된다.

 

‘T’를 입력하면 _getch함수는 ‘T’만 출력하는 반면,

_getche함수는 ‘TT’를 출력하게 된다.

 

 

_getch, _getche 함수는 사용자로부터 프로그램을 

종료할 것인지 물어보려고 ‘y’와 같은 영문 한글자를

입력 받을 때나아무키나 누르세요와 같이 

메시지를 출력하고 프로그램을 일시적으로 멈출 때 주로 사용한다.



위 두 함수는 getchar함수와 달리 엔터를 칠 필요없이 

문자 하나만 입력하면 바로 처리가 된다.



그리고 이 함수는 conio.h 헤더 파일에 함수에 대한 

선언이 들어있기 때문에 명시해야 한다.

#include <conio.h> 와 같이






** 잘못알고 있는 것이 있으면 댓글로 알려주시면 감사하겠습니다! **

기본 입출력 함수


  : getchar, putchar, _getch, _getche

문자열 : gets_s, puts

문자, 문자열, 숫자(정수, 실수) : scanf, printf



문자 입출력 함수

 

getchar / putchar

getchar : 사용자가 키보드로 입력한 문자 혹은 

문자열에서 한 글자를 읽어서 반환하는 함수.

표준입력장치(키보드)의 입출력버퍼(I/O buffer)를 

사용하는데 버퍼가 비어있으면

키보드 입력을 기다리고 어떤 문자가 채워져 있으면 

그 문자를 읽어서 반환하는 것.


putchar : 문자를 모니터화면(콘솔)에 출력하는 함수.

 


    char ch;

    ch = getchar();

    putchar(ch);


    위와 같은 소스를 실행하면 getchar함수는 

버퍼가 비어있는지 확인 후에 비어 있다면 

사용자의 키보드입력을 기다리고 ‘TEST’를 입력한다면 

버퍼메모리에 T,E,S,T,0(null문자)라는 

문자가 채워지게 되고 putchar함수에 의해서 

'T'라는 문자가 출력된다.


char ch;

    ch = getchar();

    putchar(ch);

    ch = getchar();

    putchar(ch);

 

    다른 예로 살펴보면 위 코드를 실행하고 

‘TEST’라는 문자열을 입력하면 ‘TE’라는 문자가 출력된다.

    왜나하면 getchar함수가 입출력버퍼가 비어있는지 확인 후에 

비어있다면 사용자로부터 입력을 요구하게 되고 

사용자가 ‘TEST’를 입력하게 되면 버퍼에 왼쪽부터 차례대로 

문자가 채워지게 되는 것이고,

    getchar함수가 사용자로부터 입력받은 첫 번째 문자인 ‘T’를 

반환하며 그 값이 변수 ch에 대입된다.

그래서 putchar함수에 의해서 변수 ch에 들어있는 정보인 

'T'라는 문자가 출력이 된다.


    이제 버퍼엔 ‘T’라는 문자가 빠지게 되고 

남은 문자열인 ‘EST’가 다시 왼쪽부터 차례대로 저장된다.

    getchar함수가 다시 실행되면 버퍼가 비어있는지 확인하는데

현재는 버퍼에 저장된 정보가 있기 때문에 사용자로부터 

입력을 받지 않고 바로 버퍼에 있는 문자 하나를 반환하게 된다.

그러므로 남아있는 문자열 중에서 가장 왼쪽에 저장된 

‘E’getchar함수가 반환하므로 변수 ch에 현재 저장되어 

있는 문자‘T’에 문자‘E’overwrite된다.

    그리고 putchar함수에 의해서 변수 ch에 overwrite되어 

저장된 문자인 ‘E’가 출력되는 것이다.




* 참고 *

 

getchar함수는 문자 하나를 반환하므로 변수에 이미 문자가 

저장되어 있는 경우에 이미 저장되어 있는 문자는 지워지고 

새롭게 반환된 문자가 덮어써진다.



ch = getchar() 라는 코드는 getchar()함수를 ch 변수에 

대입한다는 의미가 아니고, 

getchar()함수가 반환한 값을 ch라는 변수에 대입한다는 의미.

 

 

버퍼(buffer) : 하나의 장치에서 다른 장치로 데이터를 전송할 

경우에 둘 사이의 전송속도 차이를 해결하기 위해서 전송할 정보를

임시로 저장하는 기억장치.


버퍼링(buffering) : 버퍼에 데이터를 일시적으로 채우는 것

(정보를 메모리(버퍼)에 저장하는 것)


플러싱(flushing) : 채워진 정보를 비우는 것


 

문자의 끝은 항상 null문자가 채워진다.

‘ABC’를 우리가 키보드를 통해서 입력했으면 메모리에는 

‘ABC'null'’이런식으로 저장된다.


 

문자를 표시할 때는 ‘AB’ 이렇게 표시하면 안된다

이 경우 마지막 문자인 B만 출력되므로 문자 하나를 표시할 때는 

'A'나 'B'이런식으로 표시해야한다.



문자열을 표시할 때는 “AB” 이렇게 큰 따옴표로 표시한다.






** 잘못알고 있는 것이 있으면 댓글로 알려주시면 감사하겠습니다! **


** 이 블로그의 C언어 공부에 대한 정리는 최호성 강사님의 유튜브 강의와 카페에 배포해주신 열혈강의(pdf)본을 보고 듣고 정리하였습니다 **

+ Recent posts