본문으로 바로가기

  

 

문자열 입력 함수 : gets, fgets

#include <stdio.h>
char * gets(char * s);
char * fgets(char * s, int n, FILE * stream);
// 파일의 끝에 도달하거나 함수 호출 실패 시 NULL포인터 반환
void main()
{
    char str[7]; // 7바이트의 메모리 공간 할당
    gets(str);  // 입력 받은 문자열을 배열 str에 저장 
    ....
}
/* 
키보드로부터 문자열을 입력 받게 되니, 확실히 문장 구성은 간단하다. 하지만,
미리 마련해 놓은 배열을 넘어서는 길이의 문자열이 입력되면, 할당 받지 않은 메모리 공간을
침범하여 실행 중 오류가 발생한다는 단점이 있다. 그래서 가급적이면 다음의 형태로 fgets함수를
호출하는 것이 좋다.
 */

 

void main()
{ 
char str[7];
fgtes(str, sizeof(str), stdin); // stdin으로부터 문자열 입력 받아서 str에 저장
//stdin으로부터 문자열을 입력 받아서 배열 str에 저장하되, sizeof(str)의 길이만큼만 저장.

위의 fgets함수의 코드를 출력해 '123456789'를 입력하면 siezof(str) = 7에 의해 7보다 작은6에 
해당하는 길이의 문자열만 읽어서 str에 저장하게 됩니다. 즉 '123456'만 출력된다. 왜 '1234567'이 아닌 '123456'이냐면 문자열을 입력 받으면 문자열의 끝에 자동으로 널 문자가 추가되기 때문에
'123456'이 출력된 것처럼 보이지만, 사실 이건 '123456\0'으로 출력된 것입니다.

 


표준 입출력 기반의 버퍼
printf, scanf, fputc, fgetc같은 표준 입출력 함수를 통해서 데이터를 입출력 하는 경우, 
해당 데이터들은 운영체제가 제공하는 '메모리 버퍼'를 중간에 통과하게 됩니다.
* 메모리 버퍼 : 데이터를 임시로 모아두는(저장하는) 메모리 공간

 

키보드로부터 입력된 데이터가 입력 스트림을 거쳐서 입력버퍼로 들어가는 시점은 엔터 키가 눌리는 시점입니다.

 


버퍼링을 하는 이유?  데이터 전송의 효율성을 위해서 바로 이동시키는 것보다 중간에 메모리 버퍼를 둬서 데이터를 한데 묶어서 이동시키는 것이 보다 효율적이고 빠릅니다.