2014-11-07 4 views
0

여기에 지정된 void 메소드 내에 do-while 루프가 포함 된 프로그램이 있습니다. 함수 내에서 루프를 종료하려고하므로 do-while 루프가 실제로 작동하도록 작동합니다. 프로그램을 실행 한 후 한 가지 경우 만 발생하는 것을 제외하고는 while (userInput! = 1) 동안 만 작동해야한다는 while 문이 있음에도 불구하고 프로그램이 계속 실행됩니다. 전역 변수를 사용하여이 문제를 해결할 수 없습니다. 이러한 기술을 사용하여 저의 임무가 제한되므로, 도움이 될 것입니다.표현식이 거짓이 되더라도 while 루프가 종료되지 않음

void functionTest() 
{ 
    int gameOver = 0; 
    int userInput; 

    do 
    { 
     printf("please enter a number 1-3"); 
     scanf("%d",&userInput); 

     switch(userInput) 
     { 
      case 1: 
       printf("You entered %d",userInput); 
       gameOver = 1; 
       break; 

      case 2: 
       printf("You entered %d",userInput); 
       gameOver = 1; 
       break; 

      case 3: 
       printf("You entered %d",userInput); 
       gameOver = 1; 
       break; 
     } 
    } 
    while(gameOver!= 1); 
} 
} 
+1

대문자 c로 작성된 이유는 무엇입니까? – Igor

+3

재생산 할 수 없습니다 : http://ideone.com/BRS5rx – clcto

+0

의도 한대로 작동하므로 전체 코드를 프로그램에 게시하십시오. – Igor

답변

0

문제는 아마 당신이 scanf와를 사용하는 경우()있다 : 여기

내 코드의 조각이다. 입력을 치기 전에 입력 한 내용이 1, 2 또는 3이 아닙니다. 선택 항목을 입력하라는 메시지가 나타나면 입력 한 내용을 정확히 알려 주실 수 있습니까?

때때로 새로운 scanf()를 사용하기 전에 표준 출력을 플러시해야합니다. scanf 줄 앞에 fflush (stdout)를 시도하십시오. older question 1older question 2을 참조하십시오.

편집 : 나는 ... "2"또는 "3", 충분히 쉽게 나가 떨어져 "1"에서 아무것도 입력하면 문제를 재현 할 수

내가 제안

, 당신은 스위치를 실행하기 전에 다음을 수행 문 : scanf와 이전

  1. 추가 FFLUSH (표준 출력)()
  2. 문자열 (% s의) 등의 입력을 허용하는 대신 수의. (char [] 필요)
  3. 후행 및 선행 공백 문자열을 자릅니다.
  4. 변환은
+0

전체 코드를 보지 않고 말하기는 어렵지만 아마도 맞을 것입니다. scanf()는 때때로 무자비한 짐승이 될 수 있습니다 :) –

+0

'scanf'가 입력을 성공적으로 읽었는지를 결정하는 것은 쉽습니다 : 반환 값을 확인하십시오. – clcto

+0

동의합니다. 이 프로그램은 스위치 케이스를 치기 전에 확실히 많은 입력 검증/마사지가 필요하지만, OP가 현재 가지고있는 것보다 더 많은 경험이 있습니다. 그런데 –

0

문제가 그런 스위치 케이스를 그 수에 기초하여 라이브러리 함수

  • 을 사용하여 번호에 해당 (정수의 일부가 아닌) 다른 문자가 입력 스트림에 존재한다면 정수를 읽을 수 있기 전에 scanf()이 실패하고 사용할 수없는 데이터가 절대 지워지지 않고 무한 루프가 발생합니다 (scanf()은 정수와 동일한 문자를 반복해서 읽지 못합니다).

    따라서 scanf()이 실패하거나 형식의 일부로 잘못된 문자를 읽을 필요가 있습니다.

    scanf("%d",&userInput); 
    

    에 :

    간단한 수정에서는 scanf를 변경하는 것

    scanf("%*[^0-9]%d",&userInput); 
    

    이 자리 0-하지 않은 입력 스트림에서 모든 문자를 읽고 (폐기) 할 9 정수를 읽기 전에 ...하지만 여전히 scanf가 다른 이유로 (닫힌 입력 스트림과 같은) 실패하는지 확인하지 않습니다.

    이 같은 뭔가를 대체 할 수 :

    int scanfRes,c; 
    do { 
        scanfRes = scanf("%d",&userInput); /* try to read userInput */ 
        /* ..then discard remainder of line */ 
        do { 
         if ((c = fgetc(stdin)) == EOF) 
          return; /* ..return on error or EOF */ 
        } while (c != '\n'); 
    } while (scanfRes != 1); /* ..retry until userInput is assigned */ 
    

    을 ..필드가 할당 될 때까지 scanf()을 다시 시도하고 각 시도 후에 줄의 나머지 부분을 버리고 fgetc()에 오류가 발생하거나 EOF가 발생하면 함수를 종료합니다.

  • 관련 문제