앞서 scanf 함수나 getchar 함수 같은 표준 입력 함수는 입력 버퍼를 공유합니다. 따라서 같은 버퍼를 공유하는 gets나 fgets 함수에서 개행 문자를 입력의 종료 조건으로 사용하면 문제를 일으킬 수 있습니다. 앞서 입력한 함수가 버퍼에 개행 문자를 남겨 놓는 경우 이어서 호출되는 함수가 버퍼에서 개행 문자만 가져오고 입력을 끝내는 문제가 생기기 때문입니다. 예제를 통해 문제점을 살펴보겠습니다.
// 개행 문자로 인해 get 함수가 입력을 못하는 경우
#include <stdio.h>
int main(void)
{
int age; // 나이를 저장할 변수
char name[20]; // 이름을 저장할 배열
printf("나이 입력 : ");
scanf("%d", &age); // scanf 함수로 나이 입력
printf("이름 입력 : ");
gets(name); // gets 함수로 이름 입력
printf("나이 : %d, 이름 : %s\n:, age, name);
return 0;
}
9행에서 키보드로 입력한 나이는 문자열로 버퍼에 저장되었다가 scanf 함수가 숫자로 변환하여 변수 age에 저장합니다. 이때 버퍼에 남아 있는 개행 문자가 12행의 gets 함수의 입력으로 쓰입니다. 결국 gets 함수는 버퍼에서 개행 문자를 가져와 입력을 끝내므로 키보드로 이름을 입력하는 과정이 생략되며 name 배열의 첫 번째 요소에는 널 문자가 저장되어 이름으로는 아무것도 출력되지 않습니다. 이 문제는 입력 함수들이 버퍼를 공유해서 생기므로 필요한 경우 버퍼의 내용을 지워야 합니다. 버퍼에 남아 있는 개행 문자를 지우는 방법은 간단합니다. 개행 문자를 읽어 들이는 문자 입력 함수를 호출하면 됩니다.
'프로그래밍언어 > C 언어' 카테고리의 다른 글
[C언어] 문자열을 대입하는 strcpy 함수 (0) | 2022.12.10 |
---|---|
[C 언어] 문자열을 출력하는 puts와 fputs 함수 (0) | 2022.12.10 |
[C 언어] fgets 함수를 사용한 문자열 입력 (0) | 2022.12.09 |
[C 언어] get 함수를 사용한 문자열 입력 (1) | 2022.12.09 |
[C 언어] scanf 함수를 사용한 문자열 입력 (0) | 2022.12.09 |