"C언어 stdin 버퍼 비우기"의 두 판 사이의 차이

잔글 (봇: 자동으로 텍스트 교체 (-source +syntaxhighlight))
 
(사용자 2명의 중간 판 13개는 보이지 않습니다)
1번째 줄: 1번째 줄:
==개념==
==개념==
;C언어 stdin 버퍼 비우기
;C언어, stdin 버퍼 비우기
;C Language stdin buffer clear
;C Language, stdin buffer clearing


==예시==
==예시==
* 버퍼를 비우지 않을 시
{{소스헤더|버퍼를 비우지 않는 경우}}
<source lang='C'>
<syntaxhighlight lang='C'>
#include <stdio.h>
#include <stdio.h>
 
int main() {
int main()
{
int a;
int a;
char c;
char c;
scanf("%d", &a);
scanf("%d", &a);
printf("%d\n", a);
printf("%d\n", a);
scanf("%c", &c);
scanf("%c", &c);
printf("%c\n", c);
printf("%c\n", c);
return 0;
return 0;
}
}
</source>
</syntaxhighlight>
: → 사용자는 a 변수에 숫자를 받고 c 변수에 문자를 받으려 의도함. 하지만 사용자가 실제 프로그램을 실행하면 c 변수를 따로 입력 받기 전에 자동 종료됨. 원인은 숫자 이후 입력된 엔터키에 의해 개행문자('\n')가 발생하며 c 변수에 이 개행 문자가 저장됨
: → 프로그래머는 a 변수에 숫자를 받고 c 변수에 문자를 받으려고 한 것이다. 하지만 실제 프로그램을 실행하면 c 변수를 입력하기도 전에 종료되어 버린다. 숫자를 입력하면서 친 엔터키로 개행문자('\n')가 발생하고 c 변수가 채워진 것이다.


* 버퍼를 비울 시
{{소스헤더|버퍼를 비우는 경우}}
<source lang='C'>
<syntaxhighlight lang='C'>
#include <stdio.h>
#include <stdio.h>
 
void clear_stdin() {
void clear_stdin();
int ch;
 
while ((ch = getchar()) != EOF && ch != '\n') {};
int main()
}
{
int main() {
int a;
int a;
char c;
char c;
scanf("%d", &a);
scanf("%d", &a);
printf("%d\n", a);
printf("%d\n", a);
clear_stdin();
clear_stdin();
scanf("%c", &c);
scanf("%c", &c);
printf("%c\n", c);
printf("%c\n", c);
return 0;
return 0;
}
}
</syntaxhighlight>
:→ 추가 작성한 함수 clear_stdin()를 실행하면 stdin의 개행문자가 제거되어 의도한대로 동작한다.


void clear_stdin()  
==fflush==
{
* 참고로 윈도우에서는 'fflush()'라는 stdin의 버퍼를 비워주는 함수를 쓸 수 있는데, 표준이 아니라서 리눅스 환경에서는 동작하지 않는다.
int ch;
* 때문에 위 예시에는 별도의 함수를 만들어 사용하였다.


while ((ch = getchar()) != EOF && ch != '\n') {};
==같이 보기==
}
* [[C언어 강좌]]
</source>
:→ 버퍼 함수 stdin_clear()를 실행하면 stdin의 개행문자가 제거되어 정상 동작을 함.


==fflush==
* 윈도우OS 에서는 fflush 함수를 이용해 stdin 의 버퍼를 비워줌. 다만 이는 표준에 포함되어 있지 않으며 gcc 컴파일러에서는 동작 자체를 하지 않는다. 따라서 위 예시와 같이 별도로 함수를 만들어 사용 하였음
[[분류:C]]
[[분류:C]]

2020년 11월 2일 (월) 02:40 기준 최신판

1 개념[ | ]

C언어, stdin 버퍼 비우기
C Language, stdin buffer clearing

2 예시[ | ]

버퍼를 비우지 않는 경우
#include <stdio.h>
int main() {
	int a;
	char c;
	scanf("%d", &a);
	printf("%d\n", a);	
	scanf("%c", &c);
	printf("%c\n", c);
	return 0;
}
→ 프로그래머는 a 변수에 숫자를 받고 c 변수에 문자를 받으려고 한 것이다. 하지만 실제 프로그램을 실행하면 c 변수를 입력하기도 전에 종료되어 버린다. 숫자를 입력하면서 친 엔터키로 개행문자('\n')가 발생하고 c 변수가 채워진 것이다.
버퍼를 비우는 경우
#include <stdio.h>
void clear_stdin() {
	int ch;
	while ((ch = getchar()) != EOF && ch != '\n') {};
}
int main() {
	int a;
	char c;
	scanf("%d", &a);
	printf("%d\n", a);	
	clear_stdin();
	scanf("%c", &c);
	printf("%c\n", c);
	return 0;
}
→ 추가 작성한 함수 clear_stdin()를 실행하면 stdin의 개행문자가 제거되어 의도한대로 동작한다.

3 fflush[ | ]

  • 참고로 윈도우에서는 'fflush()'라는 stdin의 버퍼를 비워주는 함수를 쓸 수 있는데, 표준이 아니라서 리눅스 환경에서는 동작하지 않는다.
  • 때문에 위 예시에는 별도의 함수를 만들어 사용하였다.

4 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}