일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- git
- 도커
- 구조체
- Data Structure
- 깃
- Python
- dart 언어
- docker
- Flutter
- Unity
- c# 윈폼
- c#
- 포인터
- gitlab
- github
- vim
- 다트 언어
- jupyter lab
- C# delegate
- Houdini
- jupyter
- 유니티
- C언어 포인터
- HTML
- 플러터
- c# winform
- Algorithm
- C++
- c# 추상 클래스
- c언어
- Today
- Total
nomad-programmer
[Programming/C] Linux에서 Buffer 비우는 방법 본문
fgets 함수를 사용하여 문자열을 stdin으로 받는다고 생각해보자. 이때 fgets 함수가 받을 수 있는 길이보다 입력한 문자열이 더 길 경우, fgets 함수는 자기가 받을 수 있는 만큼만 받아 변수에 그 값을 넣어주고 끝난다.
그럼 이때 stdin 버퍼에는 입력 받고 남은 문자 찌꺼기들이 남아있다. 이것을 비워줘야 문제가 발생하지 않는다.
아래의 예제를 살펴보자.
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 |