공통으로 "문자열 + Enter"
를 입력받았다고 가정한다.
1. scanf()
scanf
함수는 Enter
나 공백
전까지 문자열을 가져오고 마지막에 널문자
를 붙인다.
2. gets()
gets
함수는 문자열을 포함해서 Enter
까지 가져오고, Enter를 널문자
로 바꾸어준다.
3. fgets()
fgets
함수는 gets 함수와 마찬가지로 Enter
까지 가져오지만, Enter를 그대로 두고 그 뒤에 추가로 널문자
를 붙인다.
4. scanf()를 사용할 때 주의할 점
scanf
함수를 사용하면 입력버퍼에서 Enter
혹은 공백
전까지의 문자열을 가져온다.
따라서 scanf 함수로 한 번 입력을 받고 나면 입력버퍼에는 Enter
혹은 공백 뒤의 데이터
가 남아있는 상태일 것이다.
이때 scanf
,gets
, fgets
함수로 입력을 받으려고 해도 이 함수들은 입력버퍼에 남아있는 Enter
혹은 공백 뒤의 데이터
를 읽게 된다.
int main(void){
int num1;
int num2;
// 1. (10+"Enter")를 입력받음
scanf("%d", &num1); // 2. 입력버퍼에서 Enter 전까지의 데이터, 즉 10을 가져옴
// 3. 입력버퍼에는 아직 "Enter"가 남아있는 상태
scanf("%d", &num2); // 4. 입력버퍼에 남아있는 Enter를 가져오고 종료
printf("%d, %d", num1, num2) //10, 10이 출력됨, Enter는 아스키코드로 10이기 때문
return 0;
}
이런식으로 말이다.
그런데 우리는 입력버퍼에 남아있는 데이터가 아니라 새로운 데이터를 입력받고 싶다.
그럴 때는 fflush(stdin)
함수나 getchar()
함수를 사용해 입력버퍼를 비워주면 된다.
int main(void){
int num1;
int num2;
scanf("%d", &num1);
// 1. fflush(stdin) => 입력 버퍼를 비워줌
// 2. while(getchar() != '\n') => \n(Enter)를 만날 때까지 계속 읽어들여 입력버퍼를 비워줌
scanf("%d", &num2);
printf("%d, %d", num1, num2)
return 0;
}
그런데 fflush(stdin)
방식은 비표준
이므로 경우에 따라 안 될 가능성이 있으니 getchar()
함수를 통해 입력버퍼를 비워주는 방식을 택하는 것이 좋다.