scanf(), gets(), fgets() 차이

유석현(SeokHyun Yu)·2022년 7월 24일
1

정보

목록 보기
2/9
post-thumbnail

공통으로 "문자열 + 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() 함수를 통해 입력버퍼를 비워주는 방식을 택하는 것이 좋다.

profile
Backend Engineer

0개의 댓글