반응형

문자열(String)(2)

 

 

※ 문자 입출력 라이브러리 ※

 

문자와 문자열은 프로그램에서 아주 많이 사용된다.

 

따라서 기본적인 연산들은 모두 라이브러리 함수로 지원된다.

 

문자와 문자열을 처리하고 입출력하는 라이브러리에 대하여 자세히 살펴보도록 한다.

 


 

 

이제까지 우리가 했던 대로 문자나 문자열은 printf() 함수나 scanf() 함수로 입출력을 할 수 있었다.

 

하지만 특정한 경우, 다른 입출력 함수들을 사용하는 것이 코드를 간단하게 만든다.

 

즉, 상황에 따라 맞는 함수를 써야 코드도 간단해진다는 것이다.

 

그럼 일단 문자를 입출력하는 함수들의 원형(?)을 봐보자

 

int getchar(void) : 하나의 문자를 읽어서 반환한다.

void putchar(int c) : 변수 c에 저장된 문자를 출력한다.

int getch(void) : 하나의 문자를 읽어서 반환한다. (버퍼를 사용하지 않는다.)

void putch(int c) : 변수 c에 저장된 문자를 출력한다. (버퍼를 사용하지 않는다.)

scanf("%c", &c) : 하나의 문자를 읽어서 변수 c에 저장한다.

printf("%c",c) : 변수 c에 저장된 문자를 출력한다.

char *gets(char *s) : 한 줄의 문자열을 읽어서 문자 배열 s[]에 저장한다.

int puts(const char*s) : 배열 s[]에 저장되어 있는 한 줄의 문자열을 출력한다.

 


 

 

※ getchar() 과 putchar() ※

 

형식

int getchar(void);

int putchar(int c);

 

해석 : 하나의 문자를 입력받거나 출력한다.

 

이 함수들은 stdio.h를 포함하면 된다.

 

 

먼저 getchar() 함수는 하나의 문자를 읽어 들인다.

 

int ch;

ch = getchar();

 

해석

정수형 변수 ch를 선언하고, getchar() 함수로 사용자에게 문자를 받아 변수 ch에 저장한다.

 

자 그럼 여기서 함수 반환형에 대해서 설명해본다.

 

문자를 입력받는데 왜 int형일까? 그 이유는 

 

입력의 끝을 나타내는 EOF(End of File) 문자를 체크하기 위해서이다.

 

getchar() 함수의 반환형은 char형이 아니라 int형이라는 걸 기억해 둔다.

 

다음의 코드를 보자

 

int ch;

while((ch = getchar()) != EOF)
	putchar(ch);

return 0;

 

해석

정수형 변수 ch를 선언한다.

 

while문을 실행하는데 조건을 보면

 

먼저 사용자에게 입력을 받고 그 값을 ch에 저장한다음 

저장된 값이 EOF가 아니면 다음 문장을 실행한다.

 

저장된 값이 EOF가 아니라면 ch에 저장된 문자를 출력한다.

 

이때 EOF는 CTRL + Z 를 말한다.

 

getchar() 함수를 사용해 보면 키보드에서 하나의 문자를 입력해도 반응이 없다는 걸 느낄 것이다.

 

그 이유는 getchar() 함수가 버퍼를 사용하기 때문인데, 그럼 버퍼는 무엇일까?

 

일단 사용자가 키보드를 이용해서 문자를 입력하면 

 

이들 문자는 곧바로 프로그램으로 가는 것이 아니라

 

버퍼(buffer)라고 불리는 저장공간으로 간다. 

 

엔터키가 눌리면 버퍼에 저장되었던 문자들이 프로그램으로 전달된다.

 

보통 입력이나 출력에 버퍼를 사용하는 것은 

 

다중 사용자 환경에서 컴퓨터를 효율적으로 사용하기 위해서이다.

 

그러나 pc 환경에서는 보통 단일 사용자이므로 즉각적인 응답을 원할 때는 

 

_getch()라는 함수를 사용해야 한다.

 

_getch() 함수는 getchar() 함수와 달리 버퍼를 사용하지 않는다.

 


 

 

※ _getch() 와 _putch() ※

 

형식

int _getch(void);

int _putch(int c);

 

해석

하나의 문자를 입력받거나 출력한다. 단 에코가 없으며 버퍼를 사용하지 않는다.

 

 

이 함수들을 사용하려면 <conio.h>를 포함해줘야 한다.

 

이 두 개 함수는 ANSI C 표준 라이브러리 함수에 포함되지 않기 때문이다.

 

하지만 많은 컴파일러가 이 함수들을 지원하고 있기 때문에 알아두는 것이 좋다.

 

이 둘 함수는 getchar() 함수와 putchar() 함수와 같은 역할이지만 다른 점이 있다면

 

버퍼를 사용하지 않는 문자 단위 입출력 함수라는 것이다.

 

따라서 사용자가 문자를 하나 입력하면 바로 프로그램으로 전달되는 것이다.

 

그리고 또 다른 점은 이 두 개 함수는 echo를 하지 않는다.

 

getchar() 함수와 같은 보통 입출력 함수들은 문자를 입력받으면서 화면에도 문자를 출력하는데

 

_getch() 함수는 전혀 화면에 아무것도 나타내지 않는다.

 

만약 _getch()를 사용하는데 출력이 필요하다면 _getche() 함수를 사용할 수 있다.

 

다음은 get이 붙은 입출력 함수의 비교이다.

 

getchar() : <stdio.h> | 버퍼 사용 | 에코 O | 줄 단위 | 문자 수정 가능

_getch() : <conio.h> | 버퍼 미사용 | 에코 X | 문자 단위 | 문자 수정 불가능

_getche() : <conio.h> | 버퍼 미사용 | 에코 O | 문자 단위 | 문자 수정 불가능

 

버퍼를 사용하면 엔터를 쳐야 출력이 된다는 뜻이다.

 

에코를 안 한다는 건 입력하는 동안 사용자가 뭘 입력했는지 안 보인다는 뜻이다.

 

이 경우는 신중하게 입력해야 한다.

 

문자 수정 불가능은 버퍼를 사용하지 않기 저장이 안 되기 때문에

 

문자를 지우고 다시 쓸 수 없다는 뜻이다.

 

다음의 코드를 봐보자

 

int ch;

while((ch = _getch()) != 'q')
	_putch(ch);

return 0;

 

해석

정수형 변수 ch 선언한다.

 

while문 실행하는데 조건을 보면 사용자로부터 입력받고 입력값을 보여주진 않으며 ch에 저장한다.

 

ch에 저장된 데이터가 q가 아니라면 ch에 저장된 데이터를 출력

 

프로그램 종료

 

그리고 주의할 점은 _getch() 함수는 EOF의 CTRL도 하나의 문자로 보기 때문에 

 

여기선 사용할 수 없다.

 


 

 

※ scanf()와 printf() ※

 

우리가 많이 쓰는 함수이다. 

 

일반적으로 문자열을 입출력하는 경우는 이 두 함수를 사용하면 된다.

 


 

※ get()와 puts()의 함수 원형 ※

 

char*gets(char *buffer);

 

int puts(const char *str);

 


※ get() 와 puts() ※

 

scanf()를 사용하면 하나의 단어밖에 입력받지 못하는데, 

 

한 줄 전체를 입력받으려면 함수 gets()를 사용해야 한다.

 

get()는 표준 입력으로부터 엔터키, 즉 줄 바꿈 문자가 나올 때까지 한 줄을 문자열로 받는다.

 

단, 문자열에 줄바꿈 문자는 포함되지 않으며 대신에 자동으로 NULL 문자(\0)를 추가한다.

 

그리고 입력받은 문자열은 위의 함수 원형에서 buffer가 가리키는 주소에 저장이 된다.

 

만약 성공적으로 입력을 받으면 버퍼에 있는 인수가 그대로 반환되고,

 

실패하였으면 NULL값이 반환되는 것이다.

 


 

 

put()는 위의 함수 원형에서 str가 가리키는 문자열을 받아서화면에 출력하는 함수이다.

 

이때 문자열의 끝에 있는 NULL 문자(\0)는 줄 바꿈 문자('\n')로 변경된다.

 

만약 출력 작업이 성공적이었으면 음수가 아닌 값이 반환되고,

 

실패했으면 EOF(End Of File)이 반환된다.

 


 

 

※ gets() 함수와 puts() 함수의 존재 이유 ※

 

이미 문자열을 입출력하는 기능이 있는 함수가 있다.

 

우리가 흔히 쓰는 scanf()와 printf()이다.

 

그래도 gets()와 puts()를 사용하는 이유는

 

scanf()와 printf()는 매우 복잡한 함수라서

 

문자열만을 입력하거나 출력하려면 gets()와 puts()를 사용하는 것이 속도 면에서 빠르기 때문이다.

 

또한 한 줄 전체를 받으려면 scanf()보다는 gets()를 사용하는 게 옳다.

 

단, gets()를 사용할 때는 주의해야 할 게 있는데

 

gets()는 입력되는 문자열의 크기를 검사하지 않고 사용자가 입력하는 대로 저장하기 때문에

 

충분한 크기의 문자 배열을 사용해야 한다.

 

만약 문자 배열의 크기보다 더 큰 문자열이 저장되면 다른 자료들이 덮여 씌워질 수 있다.

 

그래서 gets()을 보완한 게 gets_s()이다.

 


 

 

정리하자면 getchar()와 putchar(), _getch(), _putch() 모두 자료형은 int형이지만,

 

_getch()와 _putch()는 버퍼를 사용하지 않으며 사용자에게 echo를 해주지 않는다.

 

그리고 _getch()와 _getche()를 사용하려면 conio.h를 포함해줘야 한다.

 

gets()와 put()는 문자열 한 줄을 받는다.

 

단, 충분한 크기의 문자 배열을 선언해 줘야 한다.

 

반응형

+ Recent posts