c언어 막 시작한 초보자입니다... 정수와 실수까지는 입력이 되는데 문자를 바료 입력 안받고 넘어가버립니다.. 이유가 뭘까요
조회수 1477회
int main()
{
int a;
float b;
char c1;
printf("정수 입력 : ");
scanf("%d", &a);
printf("실수 입력 : ");
scanf("%f", &b);
printf("문자 입력 : ");
scanf("%c", &c1);
printf("%d\n %f\n", a, b);
printf("%c\n", c1);
return 0;
}
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
2 답변
-
키보드로 입력한 값은 입력 스트림이라는 곳에 저장이 되고, scanf 함수는 입력 스트림에서 값을 읽어옵니다.
이 때, scanf 함수는
%d
또는%f
같은 포맷형식을 참고해서 입력 스트림에서 그에 맞는 형태의 값을 읽어 드립니다. 그런데%c
같은 경우에는 입력 스트림에서 문자 하나를 그냥 가져 옵니다.작성하신 코드에서 문제가 뭐냐하면
scanf("%f", &b);
에서 사용자가 실수값을 치고 엔터키를 누를텐데, 이 때 실수값과 엔터값(줄바꿈값,'\n'
)이 입력 스트림에 저장됩니다. 그리고"%f"
로 해석하여 입력 스트림안에서 실수형태의 값을 가져다가 b에 저장합니다. 이러고 나면 입력 스트림에는 엔터값(줄바꿈값,'\n'
)이 남아 있는 상태입니다.이 상태에서
scanf("%c", &c1);
이 실행되는 순간 입력스트림에 남아 있던'\n'
이 c1에 저장되고 scanf 함수가 종료되게 됩니다.그래서 이러한 문제를 피하기 위해서는
"%c"
라고 쓰지 말고, 앞에 공백을 하나 넣어서" %c"
로 하는 것을 공식 문서 등에서 추천하고 있습니다. 이렇게 공백 하나를 넣게되면 입력 스트림속에있는 스페이스나 줄바꿈, 탭 등을 저 공백하나가 흡수하게 되고 그러한 문자 뒤의 실제 글자 하나를 받아 들이게 됩니다.설명이 길었는데, 사용자의 입력을 얻는 경우라면
"%c"
를 습관적으로" %c"
의 형태로 사용하시면 됩니다.아래 코드와 결과 참고하세요.
-코드
#include <stdio.h> int main() { int a; float b; char c1; printf("정수 입력 : "); scanf("%d", &a); printf("실수 입력 : "); scanf("%f", &b); printf("문자 입력 : "); scanf(" %c", &c1); printf("%d\n %f\n", a, b); printf("%c\n", c1); return 0; }
- 결과
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
- 직전에 입력받은게 남아있다는것을 몰랐네요. 배워갑니다~ noah0508 2021.3.9 08:53
- 와.... 생각지도 못했습니다.... 진짜 감사드려요 ㅠㅠㅠㅠ 알 수 없는 사용자 2021.3.9 12:54
-
입력이 안되는 이유까지는 몰랐었지만 저는 이렇게 입력받을 %c를 %s로 바꿨어요.
#include <stdio.h> int main() { int a; float b; char c1; printf("정수 입력 : "); scanf("%d", &a); printf("실수 입력 : "); scanf("%f", &b); printf("문자 입력 : "); scanf("%s", &c1); printf("%d\n %f\n", a, b); printf("%c\n", c1); return 0; }
댓글 입력