2012-01-23 4 views
1

사용자가 선택한 컴퓨터를 0에서 100 사이의 숫자로 추측해야하는 프로그램을 만들려고합니다. 프로그램은 7 회 시도에서 숫자를 추측해야하지만 scanf()에 문제가 있습니다. 프로그램이 숫자를 추측하려고 할 때, 사용자는 추측 된 숫자가 너무 높거나, 너무 낮거나, 정확하면이를 알려야합니다. 이 프로그램은 사용자가 한 문자 응답을 입력 할 때 제대로 작동하지만 "응답"에 두 개 이상의 문자가있는 경우 이상하게 작동합니다. 그래서 응답을 단 한 문자로 제한하고 싶습니다. 어떻게해야합니까? 거의루프 내 scanf()

if (strlen(response) > 1) { 

response[2] 확인에이 폭발하게

감사

#include <stdio.h> 
#include <string.h> 

int main() { 
    char response[1]; 
    int numOfGuesses = 1; 
    int min = 0; 
    int max = 100; 
    int guess = (max+min)/2; 
    int end = 0; 

    do { 
     printf("%d) %d: (h)igh, (l)ow, or (c)orrect? ", numOfGuesses, guess); 
     if (scanf("%1s", response) == 1) { 

      printf("%s \n", response); 
      if (strlen(response) > 1) { 
       printf("D'oh! Wrong response!! \n"); 
      } else { 
       if (response[0] == 'h') { 
        max = guess; 
        numOfGuesses++; 
       } else if (response[0] == 'l') { 
        min = guess; 
        numOfGuesses++; 
       } else if (response[0] == 'c') { 
        printf("Correct! It took %d turns. \n", numOfGuesses); 
        end = 1; 
       } else { 
        printf("D'oh! Wrong response! \n"); 
       } 

       guess = (max+min)/2; 
      } 

     } else { 
      end = 1; 
     } 

    } while (end == 0); 

    return 0; 
} 
+0

왜 그냥 대신 하나의 숯불을 사용하지 않는거야? –

답변

4

귀하의 response 버퍼가 종료 null가 아닌.

또는 %1s 대신 에서 %c을 사용할 수 있습니다.

편집 : 모든 scanf와 후이 함수를 호출

시도, 그것은 첫 번째 문자 이후에 유효하지 않은 입력을 제거, 다음 개행 문자까지 입력 버퍼를 플러시합니다. 당신은 단지 하나의 문자 입력을 찾고 있다면

void flush_input() 
{ 
    int c = 0; 

    do 
    { 
     c = getchar(); 
    } while (c != EOF && c != '\n'); 
} 
+0

내 코드가 여전히 이러한 변경 사항을 루프에 괴물 – likebeats

+0

괴물이 정확히 무엇을 의미합니까? 사용자가 1 문자 이상을 입력 한 경우 입력 버퍼를 소진해야 할 수도 있습니다. 그렇지 않으면 남은 문자가 다음 scanf에서 읽혀집니다. – pezcode

0

이 메모리를 저장하기위한 추가 점수를 얻고있다 : 여기

더 자세히 getchar()에 대해 설명하고 당신이 관심이 있다면, 몇 가지 예문이있는 페이지입니까? 그것은 좋은 습관해서, char response[BUFSIZ];

당신은 루프 전에 초기화해야합니다 :

#include <stdio.h> 상단까지 다음 큰 틱 배열로 응답을 선언 * 응답 = '\ 0';

많은 일을하지 않으므로 scanf() 대신 gets (응답)를 호출 할 수 있습니다. 이것은 입력 된 전체 행에서 읽 t집니다. 최신 컴파일러 및/또는 실행 시간은 gets()가 제공된 배열 (scanf()가 수행 한 것)의 끝에서 실행될 수 있으므로 whites() 대신 fgets()를 제안합니다. 더 많은-올바른 조각이된다 :

if (scanf("%1s", response) == 1) { 

if (scanf("%2s", response) == 1) { 

대신

fgets(response, sizeof response, stdin); 
0

사용이 한 번에 대신 1의 2 개 문자를 읽을 컴파일러를 만드는