문자열을 받고 쓰기위해서는 입력버퍼와 출력버퍼를 이용하셔야합니다
물론 입력버퍼와 출력버퍼를 이용하지 않으셔도 되지만

자꾸 바로바로 문자열을 가져올경우 cpu에 무리를주므로
cpu가 한가할떄마다 문자열을 가져갈수잇도록 해주시면됩니다

우선 입출력을 하는 원리부터 알아보죠

우리가 글자를 입력하면 "입력스트림"을 통해 프로그램안의 메모리로 들어가게됩니다
그리곤 출력을 원할때 "출력스트림"을 통해서 모니터에 표기해주게됩니다


System
┌────┐  -----[출력스트림]--> 모니터
│실행중인│
│시스템   │
└────┘ <----[입력스트림]-- 키보드

이런식으로 돌아가게됩니다
저 입력스트림과 출력스트림은 일종의 프로그램과 모니터 키보드를 연결하는 터널과같은것입니다

즉 저 다리를 놓기 위해서는 입출력을해주는 스트림을만들어줘야합니다

stdin (표준 입력 스트림) -> 키보드로해야겟죠?
stdout (표준 출력 스트림) -> 모니터
stderr (표준 에러 스트림) -> 모니터

그럼 본격적으로 문자입출력에 대해 알아봅시다,

문자 입출력을 하기위해서 putchar와 fputc 이란 함수를 기본적으로 이용합니다

----------------------------------------------------------------------
심화의 창
(입출력 두가지 경우가 잇지만 한가지 경우만 생각해서 글을 씁니다)
int putchar(int a);
int fputc(int c, FILE* stream);

위에 보신것과같이 문자를 출력하는 함수는 두가지로 나뉘어집니다
fputc 도 putchar와 같이 문자를 출력하는 함수이지만
좀더 장점이라고 할까요?
문자를 출력할 스트림을 직접지정할수있습니다
위 명령어에서는 파일에 문자를 저장한다고 할수잇죠

쓴김에마져씁시다
문자 입력을받을때도 역시 두가지 함수가잇습니다
int getchar(void);
int fgets(FILE* stream);

위와 같이 fgets도 문자를 입력받는것이지만
장점이라 함은 입력받을 문자를 어디로 입력받을지를 지정할수잇습니다
------------------------------------------------------------------

입출력을 하기전에 EOF 란거에대해 알으셔야합니다,
fgetc 나 getchar함수가 파일 끝에 도달하는경우에 EOF라는게 반환이 됩니다,

"그래서 여기까지가 내가가져갈문자구나, 여기까지만 가져가자" 라고 생각하게되는거죠
키보드로 Ctrl+Z 를 입력하시면 getchar함수가 EOF를 알아서 반환해줍니다,ㅎ

자 그럼 간단한 예제를 통해 문자 입력을 받고 출력을 해봅시다

잡 소스는생략하고 중심소스만적겟습니다 :p

char str[10]

fputs("입력할꺼적어바", stdout);
fgets(str, sizeof(str), stdin);

fputs("입력된 문자 ->", stdout);
fputs(str, stdout);


이러케 입출력을받죠

근대 의문점, fgets(str, sizeof(str), stdin);
여기서 중간에잇는 sizeof(str) 은뭘까요?

그거는 내가 출력할문자열을 어디까지가져오는지 정해주는것입니다
즉,
char str[10]으로하는순간 그안에 쓰레기값으로 찰것입니다(확실히 차는지는 의문이군요,,)

하여튼, 그러케 해노코 내가입력한값이 3~5글자 이런식이면
뒤에 붙은 쓰레기 값까지 출력할 이유가 엄짜나요?
그러니까 sizeof(str)을 이용해 내가 출력할 문자열의 길이만큼만 가져가라 이런거죠~

fets를이용한셔도 큰문제는 생기지않아요,
입력한값이 10글자가넘어가도 9글짜까지만 표기주죠,ㅋ

왜 10글자가 아니라 9글짜냐~
마지막에 Null문자를 삽입해서 여기까지가 니가가져갈문자다~ 라고 표시를해줘야하니까요,ㅎ


그럼 이제 좀더 심화된 내용으로들어가봅시다
표준 입출력을 해봣습니다,  이제 "버퍼"라는 거 대해 알아보도록합시다

System
┌────┐  --<임시보관창고>---[출력스트림]--> 모니터
│실행중인│
│시스템   │
└────┘ <--<임시보관창고>---[입력스트림]-- 키보드


이런 구죠입니다


그러니까 버퍼라는 의미는 정확히 모르지만 제가아는 한도내에서 정의해드리도록하죠;

버퍼란게 존재하는이유는

아까 처음처럼 표준 입출력을가지고 할경우에
내가 입력값을 받자마자 바로 출력해주는형태였습니다,

이런식의 프로그램이 물론 빠르고 좋겟지만
단점은, cpu에 무리를 준다는점에 있습니다

그래서 생긴게 버퍼입니다,
내가 키보드를 이용해 문자를 입력하면
임시보관창고에 들어가게됩니다,

그리고 일정 크기이상이 되면 프로그램에 들어가게되고
다시 모니터로 가기전에 임시보관창고에서 대기를하게됩니다

그리고 "cpu가 한가할때" 한번씩들려서 어? 잇네? 가져가야지~
이런식으로 가져가게되죠, 그러면 cpu가 아주~ 조아라하겟죠,

이런 임시보관창고가 "버퍼" 입니다

System
┌────┐  --<출력버퍼>---[출력스트림]--> 모니터
│실행중인│
│시스템   │
└────┘ <--<입력버퍼>---[입력스트림]-- 키보드


정확한 구죠를따리자면 이런식이겟죠?ㅎ

여기서 하나 더알아야할것은  fflush 이란 함수입니다
이자식은 우리가 집어넣어서 임시보관하고잇는 버퍼라는공간을
비워주는 함수입니다

만일 함수를비우지 않는다?
내가 "커플이"를 입력해서 한번가져갓습니다
그리고 버퍼를지우지않고 다시 "최고짱짱"을 입력햇습니다

그리곤 4글짜가져와~ 이러면
커플이가 비워졋다면 정상적으로 "최고짱짱"을 가져가겟지만
이미 입력버퍼순서대로 저문자보다 앞에 "커플이"란게잇으므로

"커플이최"가 출력이 되어버리는 불상사가 생기죠,

이걸토대로 짜본 예제입니다,

/* str_fflush */

#include <stdio.h>
int main(void)
{
        while(1)
        {
                char string[10];

                fflush(stdin);        //입력버퍼를 지웁니다

        fputs("문자를 입력해보세요 : ", stdout);

                fgets(string, sizeof(string), stdin);        //입력버터에서 일정길이의 문자열을가져옵니다

        printf("당신이 입력한 문자 -> %s \n", string);

        }
        return 0;
}


Trackback Address :: http://couple.haruschool.com/tc/trackback/212

댓글을 달아 주세요