2014-01-07 1 views
0

나는 회로의 반경을 입력 한 다음 계산하고자하는 것을 선택하도록 요청하는이 프로그램에 노력하고 있습니다 : 면적, 둘레 또는 실린더의 볼륨 ..'계산 영역과 회로의 둘레'프로그램의 이상한 출력

#include <stdio.h> 

int main(void) 
{ 
float radius=0.0,height=0.0; 
char choice,quit; 
const float pi=3.1415658; 

do 
{ 
printf("Enter radius : \n"); 
scanf("%f",&radius); 

printf("\n\nWhat do you want to calc.?\nArea of circuit --> press A\n" 
"Circumference of circuit --> press C\nVolume of cylinder --> press V\nQuit --> Q\n"); 

scanf("%c",&choice); 

switch (choice) 
{ 
case 'A': 
    printf("Area = %.5f\n",radius*radius*pi); 
    break; 
case 'C': 
    printf("Circumference = %.5f\n",2*radius*pi); 
    break; 
case 'V': 
    printf("Enter Hight : \n"); 
    scanf("%f",&height); 
    printf("Volume of cylinder = %.5f\n",radius*radius*pi*height); 
    break; 
case 'Q': 
    quit='y'; 
    break; 
default: 
    printf("default!!\n"); 
    break; 
} 
}while(quit != 'y'); 

return 0; 
} 

하지만 사용자의 선택을 읽고 기본에 직접 뛰어 건너 뛰는 이유는

 
Enter radius : 
3 

What do you want to calc.? 
Area of circuit --> press A 
Circumference of circuit --> press C 
Volume of cylinder --> press V 
Quit --> Q 
/*here before I choose anything the next line appears, skipping reading the choice*/ 
default!! 
Enter radius : 

그래서 프로그램을 실행하면? 무엇이 문제입니까 ??

+0

를 제외하고 오류를'scanf'을 사용하여, 당신은'quit'를 초기화해야합니다. –

+0

이 문제를 디버그하는 올바른 방법은 디버거에서 프로그램을 단계별로 실행하고 문제가있는 각 단계에서 관련 값을 검사하거나 실행 중에 값을 인쇄하여 실행중인 작업을 표시하는 것입니다. 당신을 위해 그것을 디버깅하도록 다른 사람들에게 부탁하는 것은 부적절합니다. –

답변

3

scanf을 사용하여 반지름을 읽을 때 사용자가 입력을 끝내기 위해 누르는 줄 바꿈이 여전히 입력 버퍼에 있기 때문입니다. 따라서 나중에 문자를 읽기 위해 scanf을 사용할 때, 그 줄 바꿈을 읽습니다.

단순한 해결책은 후자의 scanf에게 선행 공백을 무시하도록하는 것입니다. 이 작업은 scanf 형식 코드에 공백을 추가하여 수행됩니다

scanf(" %c", &choice); 
/* ^   */ 
/*  |   */ 
/* Note space here */ 
+0

뭐라구, 효과가 있었는데 왜 이해가 안되니? 먼저 "반경을 읽기 위해 scanf를 사용할 때 입력을 끝내기 위해 누르는 줄 바꿈은 여전히 ​​입력 버퍼에 있습니다"라는 것을 이해합니다. 그러나 그 문제는 무엇입니까? 둘째 - scanf가 새 줄을 읽는 데 어떤 문제가 있습니까? 나는 전체 프로그램에 영향을 미칠 사람을 의미합니다. 마지막으로, "개행"문자를 건너 뛰려면 후자의 scanf에게 알려야 함을 의미합니까? scanf 형식 코드에 공백을 추가하면 어떻게됩니까? 방해해서 죄송합니다 – Salahuddin

+0

@Salahuddin 입력 버퍼의 다음 문자가 개행 문자이고 다음 문자를 읽고 싶다면 그 개행 문자와 입력 판독 기능 (귀하의 경우에는'scanf' 함수)이 행복하게 그걸로 돌아갑니다. –

+0

@Salahuddin 또한'scanf' 형식 문자열에 공백이 있으면'isspace' 함수가 true를 반환하는 모든 문자를 건너 뛰고, 줄 바꿈 문자는 공백 문자입니다. –