본문 바로가기

C/Study

[C] scanf 함수 char형 하나의 문자 입력받을 시 발생하는 문제

반응형

아래와 같은 코드를 실행시켜 보면

#include <stdio.h>

int main(void)
{
	char str[30] = {0};
	char ch = 0;

	scanf("%s", str);
	scanf("%c", &ch);

	printf("%s\n", str);
	printf("%c\n", ch);

	return 0;
}

 

사용자가 "abc"를 입력했을 경우 "abc"를 str에 입력받고나서

ch에 입력받을 문자를 사용자가 입력 하기를 기다려야 되는데 그냥 넘어가 버린다.

이유는 사용자가 "abc"를 입력할 때 입력되는 문자열은 정확하게는 "abc(enter)"이다.

이 때문에 str에 "abc"가 입력이되고 입력버퍼에는 "(enter)"가 남아있게 된다. (엔터가...)

그래서 ch에 하나의 문자를 입력받을 차례에 이 "(enter)"가 입력이 되어버리고 출력 결과에 보면 줄바뀜이 되는걸 확인할 수 있다.

이를 해결하기 위해서는

1. scanf(" %c", &ch); 와 같이 %c 앞에 공백을 넣어준다.

2. getchar();를 scanf 사용전에 써서 getchar 함수가 엔터값을 입력 받도록 하면 된다. (아래로 전부 scanf 사용 전에 코드를 추가)

scanf("%s", str);
getchar();
scanf("%c", &ch);

 

3. fflush(stdin); 을 추가해서 입력 버퍼를 비워줘도 된다. 하지만 gcc에선 안 된다.

scanf("%s", str);
fflush(stdin);
scanf("%c", &ch);

 

4. rewind(stdio); 를 추가. 정확한 원리는 모르겠다. gcc에서도 되는지도 모르겠다.

scanf("%s", str);
rewind(stdio);
scanf("%c", &ch);
반응형