gets 함수와 fgets 함수의 차이점
헤더 파일 :
함수 원형 :
char *fgets(char *s, int n, FILE *stream);
gets 함수는 Enter 키가 눌려질 때까지 문자열을 입력 받으며 Enter 키가 눌려지기 전에는 Backspace 키를 사용하여 제한된 수정이 가능하다.
입력을 stdin으로 하기 때문에 Enter 키가 입력되면 '\n'을 '\0'로 바꾸어 문자열에 저장시킨다('\n'을 입력의 끝으로 판단한다).
fgets 함수는 '\n' 문자를 만날 때까지 문자열을 읽어 들이거나, 최대 n-1개 만큼 배열 s로 읽어 들인다.
읽어들인 문자열 뒤에 NULL 문자가 삽입되므로 s는 곧바로 출력 함수에 사용될 수 있다.
입력 스트림에서 '\n'를 읽는다면 문자열에 포함된다. 크기를 지정해 주면 아무리 많은 문자를 넣어도
크기 만큼 입력으로 받아 들이고 나머지는 버퍼에 남아 있게 되어 다음 입력시에 사용된다.
두 함수의 근본적인 차이점은 Input의 위치이다. gets는 무조건 stdin을 Input으로 하고,
fgets 함수는 파일 또는 stdin 등 지정하는 방법에 따라 동작한다.
scanf 함수
scanf()에서 %d는 숫자, %s는 문자열, %c는 문자를 받을때 사용한다.
그리고 %d%c는 숫자와 문자를 같이 받을 때 사용한다. 문자와 숫자 사이에는 공백이 있어야 한다.
주의 할 것은 문자열을 입력 받을 때, scanf()는 중간에 공백가 있으면 공배 전까지만 입력받는다.
그렇기 때문에 문자열을 입력 받을 때에는 scanf()가 적합하지 않다.
예를 들어, scanf(%s, &str)인 경우
'abcd efg'를 입력한 경우 str 변수에는 'abcd'가 들어간다.
scanf 함수 사용시 주의 점
scanf("%d", &a); 다음에 바로 오는 gets 함수는 실행이 안된다.
이것은 scanf()에 의해서 입력된 엔터 값이 키 입력 버퍼에 남아 있어서
다음에 오는 gets()가 엔터가 입력된 것으로 간주해서 처리하기 때문이다.
그렇기 때문에 scanf() 처리 후 버퍼 내용을 지우기 위해 fflush(stdin);를 추가해야 한다.
stdin은 표준 입력 장치를 가리킨다.
[사용예]
printf("Enter the Integer: ");
scanf("%d", &a);
fflush(stdin);
printf("Enter the String: ");
gets(str); /* 이상없이 입력 됨 */
fgets()
gets()에 의해서 입력되는 문자열은 제한없이 받아들여지기 때문에 실제 문자열 크기를 초과할 수 있다.
하여 받아 들여질 수 있다. 그렇게 되는 경우에 오버플로가 발생하여 해당 문자열 처리시 오류가 발생한다.
그래서 fgets() 사용을 권장한다.
(사용예)
printf("Enter the Integer: ");
scanf("%d", &a);
fflush(stdin);
printf("Enter the String: ");
fgets(str, 100, stdin);
-------------------------------------------------------------------------------------
==================[fgets 함수 사용시 문자열 끝에 개행문자 추가]===================
int main()
{
char *name;
name=(char *)malloc(sizeof(char)*10);
fgets(name, 10, stdin);
*(name+(strlen(name)-1))=0; /* fget() 사용시 개행문자 \n 제거 */
for(;*name;name++)
printf("%c %d\n", *name, *name);
}
================================================================================
[다른방법]
*(name + (strlen(name)-1))=0;
*(name + (strlen(name)-1))=NULL;
(strlen(name) - 1)[name]='\0';
'IT_Programming > C · C++' 카테고리의 다른 글
CRC(Cyclic Redundancy Check) 검사 구현 (0) | 2007.11.26 |
---|---|
[코드보기] strtok (0) | 2007.11.26 |
하드 디스크의 남은 용량 확인하는 API (0) | 2007.11.22 |
HOWTO: Visual C++ 어플리케이션에서 메모리 누수 추적하는 방법 (0) | 2007.08.30 |
strcpy(), strcat(), strlen(), strcmp() 함수를 직접 만드시오 (포인터연습) (0) | 2007.01.29 |