Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C] Linux에서 Buffer 비우는 방법 본문

Programming/C

[Programming/C] Linux에서 Buffer 비우는 방법

scii 2020. 1. 7. 03:57

fgets 함수를 사용하여 문자열을 stdin으로 받는다고 생각해보자. 이때 fgets 함수가 받을 수 있는 길이보다 입력한 문자열이 더 길 경우, fgets 함수는 자기가 받을 수 있는 만큼만 받아 변수에 그 값을 넣어주고 끝난다. 

그럼 이때 stdin 버퍼에는 입력 받고 남은 문자 찌꺼기들이 남아있다. 이것을 비워줘야 문제가 발생하지 않는다.

아래의 예제를 살펴보자.

stdin 버퍼에 남아있던 -7890이 출력되었다.

stdin 버퍼에 남아있는 문자들을 \n 문자가 나올 때까지 무한루프를 돌고 있다. 

어째서 \n 문자일까? 이것은 키보드에서 Enter가 나올때까지 입력 스트림에서 버퍼로 저장되기 때문이다. 즉 \n이 마지막에 존재할 것이다. 그래서 \n 문자가 나올 때까지 무한루프를 돌리면 입력 버퍼는 깨끗이 비워진다.

 

입력 버퍼를 비우지 않아 예상치 못한 결과를 얻는 예제를 살펴보자.

4 자리 숫자 입력은 입력을 받을 기회조차 얻지 못하고 프로그램이 종료되었다. 그 이유는, 6자리 숫자가 입력되고 per_id에 {'1', '2', '3', '4', '5', '6', '\0'} 이렇게 배열에 저장되었을 것이다.

그런데 stdin 버퍼에는 -7890 이라는 문자열이 남아있다. 그 상태에서 다시 fgets함수를 이요해 stdin 스트림으로 받으려고하니 입력 버퍼에 남아 있는 -7890 중 {'-', '7', '8', '9', '\0'} 문자가 four 배열에 들어간다. 

그래서 four 변수는 입력을 받을 기회조차 없이 프로그램이 끝난것이다. 그리고 아직 stdin buffer 에는 {'0', '\n'} 문자들이 아직 남아 있을 것이다.

 

이러한 문제를 해결하려면 stdin buffer 를 지워주면 된다. 아래의 예제를 살펴보자.

키보드로 입력한 문자열을 stdin스트림으로 입력버퍼에 저장하고 fgets함수의 인자로 들어간 사이즈만큼 입력버퍼에 존재하는 문자열을 per_id 변수에 집어넣었다.

그리고 아직 입력 버퍼에 남아있는 { '-', '7', '8', '9', '0', '\n' } 문자들은 

while(getchar() != '\n');

위의 명령으로 인해 입력버퍼에서 비워지게 된다. 키보드로 입력하게 되면 엔터가 나올 때 까지 입력버퍼에 들어가니 엔터('\n') 가 나올때까지 계속 문자들을 끄집어내면서 비우는 것이고 종국엔 '\n' 문자도 비워진다.

이렇게 해서 입력버퍼를 비우면 될 것이다. 

더보기

rewind(stdin);

 

'Programming > C' 카테고리의 다른 글

[C] void 형 포인터  (0) 2020.06.09
[C] 1byte씩 읽는 포인터, 리틀 엔디안, 빅 엔디안  (0) 2020.06.09
[C] const (상수화)  (0) 2020.06.09
[Programming/C] scanf_s (scanf) 함수의 리턴 값  (0) 2019.12.24
[C] 진수 계산 방법  (0) 2019.12.24
Comments