Eclipse / Minigw에서 Scanf의 문제
문제
Eclipse에서 다음 코드를 실행하려고하지만 콘솔은 출력이 "다음 값을 입력하기 (<= 0에서 종료) 2130567168 분은 35509452 시간 48 분입니다." 반복해서 반복됩니다.
Scanf는 어떤 이유로 든 기본값을 넣고있는 것 같습니다. 이유를 알 수 없습니다. 나는 프로그램이 중지되기 전에 아무것도 보지 못했기 때문에 Printf가 플러시되지 않는 것과 관련이 있다고 생각했지만 n을 사용하여 플러시를 강제로 사용했습니다.
어떤 아이디어?
#include <stdio.h>
const int MIN_PER_HOUR = 60; // minutes per hour
int main(void)
{
int hour, min, left;
printf("Convert minutes to hours and minutes!\n");
printf("Enter the number of minutes (<=0 to Quit):\n");
scanf("%d", &min); // read number of minutes
while(min > 0){
hour = min / MIN_PER_HOUR; // truncated number of hours
left = min % MIN_PER_HOUR; // number of minutes left over
printf("%d minutes is %d hours, %d minutes.\n", min, hour, left);
printf("Enter next value (<=0 to quit)");
scanf("%d", &min);
}
printf("Done!\n");
return 0;
}
해결책
Eclipse의 터미널 에뮬레이터는 다를 수 있으며 더 많은 버퍼링을 수행 할 수 있습니다. 전화 해보세요 fflush(stdout);
인쇄물과 호출 사이 scanf()
.
다른 팁
코드를 Visual C ++로 옮겼으며 예상대로 작동합니다. 내 질문은 "이클립스의 터미널 에뮬레이션이 왜 깨 졌습니까?"
입력에 정수를 나타내는 잘못된 문자가있는 경우 scanf()
, 기능은 그 캐릭터에서 멈출 것입니다. 버퍼에 남겨두고 다시 읽을 준비가되었습니다. 그리고 다시, 그리고 다시 ...
첫 번째로 "14 분"을 입력했다고 가정 해 scanf()
. 함수는 "14"를 읽고 공간에서 멈 춥니 다. 그런 다음 변수에 14를 할당합니다 min
그리고 프로그램은 계속됩니다.
그런 다음 루프 내부에서 프로그램이 다른 것을 실행합니다. scanf()
. 이번에 입력 버퍼에는 이미 공간이있는 "Mins"가 이미 있습니다. scanf()
공간을 읽고 무시하고, 정수로 변환 할 수없는 'm'을 찾아서 변수에 새 값을 할당하지 않고 멈출 것입니다. min
그리고 값을 반환합니다 0
. 그리고 다시 ... 그리고 다시 ... 그리고 다시.
그래서 당신이해야 할 일은 매번 입력 버퍼를 지우는 것입니다. scanf()
.
얼마나 분명합니까?
아마도 Enter까지 - 거의 동일합니다. fgets()
하다 :)
예를 들어:
int ch;
scanf("%d", &min);
do { ch = getchar(); } while (ch != '\n'); /* empty buffer */