2012-09-28 6 views
0
char again; 
do { 
      counter = 0; 
      while (counter < 3) { 
       printf("Please enter a number: "); 
       scanf("%d", &num); 
       counter++; 
       sum += num; 
      } 
      if (counter == 3) { 
       printf("Would you like to continue? [Y]Yes [N]No:"); 
       scanf("%c", &again); 
      } 
     }while (again == 'Y'); 

이것이 작동하지 않는 이유를 알 수없는 것 같습니다. 내가 입력하면 Y는 깨지고, 내가 입력하면 N은 깨진다. 사용자가 "N"을 입력하여 프로그램을 종료하고 다른 문자를 종료 할 때까지 반복해야합니다.깨진 Do/While 루프

+1

무엇이'다시 '입니까? – squiguy

+0

while 루프가 바뀝니다 ... –

+0

BTW,'while while (again! = 'N')'이라고 써야하지 않습니까? – rodrigo

답변

8

변경 scanf 호출 :

scanf(" %c", &again); 

트릭은 %c 전에 공간에 : 그것은 당신의 N 또는 Y. 그렇지 않으면 당신이를 읽는 것을 반환하기 전에 공백 문자를 무시하도록 scanf 기능을 지시 이전 scanf 전화에서 객차를 회수하십시오. man 3p scanf 가입일

(POSIX의 하나)

하나 이상의 공백 문자로 구성된 지시자가 제 더 이상 유효한 입력 읽어 들일 수있을 때까지 입력을 판독하여 실행하거나, 가입되어야 바이트는 공백 문자가 아니며 읽지 않은 상태로 남습니다.

이것은 복잡한 기능입니다. 나는 man 페이지를주의 깊게 읽는 것을 권장한다 : 이것은 대부분의 사람들이 생각하는 것보다 훨씬 많은 것을 할 수있다.

+0

아, 고침. 고마워. –

+0

@iccthedral : C의 명령어는 무엇입니까? AFAIK,'scanf'는 함수입니다. – rodrigo

+1

@iccthedral : 아! 지침이 아닌 _directives_입니다. POSIX 맨 페이지와 같이 _scanf_ 함수의 _good_ 참조에서 읽을 수 있습니다 (업데이트 된 답변의 링크 참조). – rodrigo

0

문제는 scanf("%c", &again)이 마지막 숫자 다음에 줄 바꿈을 읽음으로써 루프가 항상 중단된다는 것입니다. 사람들이 fgets()에 대해 sscanf()을 선호하여 scanf()을 피하는 이유이기도합니다. 당신은 더 나은 진단을 얻으려는 경향이 있습니다.

어떻게 직접 디버깅 할 수 있었습니까?

당신은 그것을 읽을 때 읽기 데이터를 인쇄 한 수 - 추가 :

printf("Read: %d\n", again); 

scanf() 후를. 또한 각각의 scanf() 전화를 확인하여 예상 데이터를 수신하는지 확인해야합니다.

if (scanf("%c", &again) != 1) 
    ...oops — error handling...