2013-07-05 6 views
4

이 코드는 배변의 게임이다. 그것은 하나의 반복 어떤 사용자 입력 Y 또는 N 후 종료하기 때문에 읽기 문자()

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <time.h> int roll_dice(void); bool play_game(void); int main() { int i, ch,win = 0,lose = 0; bool flag; srand((unsigned)time(NULL)); do { flag = play_game(); if(flag) { printf("You win!"); win++; } else { printf("You lose!"); lose++; } printf("\n\nPlay again(Y/N)? "); scanf("%c", &ch); ch = getchar(); printf("\n"); }while(ch == 'Y' || ch == 'y'); printf("\nWins: %d Losses: %d",win,lose); return 0; } int roll_dice(void) { return rand()%6 + rand()%6 + 2; } bool play_game(void) { int sum = roll_dice(); printf("You rolled: %d\n", sum); if(sum == 7 || sum == 11) return 1; else if(sum == 2 || sum == 3 || sum == 12) return 0; else { int point = sum; printf("Your point is: %d\n", point); do { sum = roll_dice(); printf("You rolled: %d\n", sum); if(sum == 7) return 0; }while(point != sum); return 1; } } 

나는 단지 코드

printf("\n\nPlay again(Y/N)? "); 
scanf("%c", &ch); 
ch = getchar(); 
printf("\n"); 

내가 사용한에 문제가 있습니다. 내가 \n을 먹고 ch = getchar()을 배치하여 잘못하고 있어요 생각 나는 그것을 제거하고 변환 지정자 앞에 공백을 배치하고 내가 그것을 잘 작동 %d로 변환 지정자를 대체 일하러 또한 did't " %c"하여 대체했다.
아무 문제가 있습니까?
나는이 post을 방문 내가했던 같은 일을 말하고있다.

+0

게임 * 쓰레기 *? ! 아니, 아니, *** 결코 ***이를 위해, 하나'는 fgetc (표준 입력)'대신 사용할 수 있습니다 - 그 보좌의 – Renan

+2

게임 .. – Alex1985

+3

는 "()'는 scanf'와 문자를 읽기". 사실,'scanf()'사용을 고려한다면, 그냥하지 마라. –

답변

4

게시 된 코드는 동작을 정의되지 않은있다. 나는 그것이 잘 작동 변환 지정자 % d 개를 교체

.

당신은 Y 또는 yint하지 않다, 그래서 입력하고 다음 (떨어져 주요 루프의 다음 반복에서 새 라인 문자를 삭제 공백에서) 소비하지 않기 때문에 scanf()이 실패 %d에 전환 할 때 ch = getchar()은 실제로 사용자가 입력 한 문자를 읽고 코드는 우연히 작동합니다. 항상 할당 된 횟수를 반환하는 반환 값 scanf()을 확인하십시오.

+0

한 가지만 들려주세요.'char'는'int'로 정의 될 수 있습니다. – haccks

+0

또한 '% d'을 (를) 사용하면'char '을 읽지 않고'ch = getchar()'는 입력 한 문자를 읽지 만 왜'\ n' (왼쪽 뒤에)는 읽지 않는지 동의합니다 다음 반복? – haccks

+0

@ haccks, 업데이트 된 답변. – hmjd

3
scanf("%c", &ch); 
ch = getchar(); 

그러면 이전의 문자를 분실 한 방법은 ch입니다. 방법에 대해

ch = fgetc(stdin); 
while (fgetc(stdin) != '\n') 
    ; 

대신에?

+0

여러 가지 가능한 방법이 있지만 그 방법으로 작동하지 않는 이유는 알고 있습니다. 당신은 이것에 관한 많은 포스트를 볼 수 있습니다. (또한 [here] (http://stackoverflow.com/questions/14419954/reading-a-single-character-in-c)) 그것은 작동해야한다고 말하고 있습니다. – haccks

+0

@haccks 내 예제는 실제로 결함이 있고 내가 의도 한 것이 아니라 고정 된 업데이트를 참조하십시오. –

3

문자를 scanf()으로 변환 한 다음 바로 뒤에 getchar()으로 덮어 씁니다. Enter 키를 누르기 전에 "yy"를 입력하지 않으면 작동하지 않을 것입니다.하지만 두 번째 확인은 실패합니다.

은 BTW, " %c"의 공간을 사용합니다. ch 유형 int이며 형식 지정자 %cchar 일치해야하기 때문에

+0

다시 내 질문을 읽고, 그것을 시도하고 그것은 나를 위해 일하지 않았다! – haccks

+1

@haccks'int ch' ->'char ch;/* "% c"* /' – BLUEPIXY

+0

@BLUEPIXY; 그래 니가 맞아. 나는 @hmjd 응답도 읽는다. – haccks

2
printf("Play again? "); 
scanf(" %c", &char); 

이 코드는 저에게 적합합니다. 이 프로젝트는 K.N.King의 "C 프로그래밍 : 현대 접근"책에서 나온 것입니다. 전에이 문제를 만났고 같은 문제가있었습니다. 224 페이지에는 정확하게 동일한 명령 "ask"("play again")가 포함 된 guess.c 예제 프로젝트가 있습니다. 그리고 저자는 scanf ("% c", & 명령)를 사용했습니다. (그는 ch 대신 명령을 사용했습니다) 작동했습니다. 나는 "게임의 게임"프로젝트 동안 그것을 사용했으나 작동하지 않았다는 것을 기억합니다. 아마도 나는 뭔가를 놓쳤을 것이다. 전체적으로 표현식이 100 %를 넘습니다.

+0

참. 나는 같은 책을 읽고있다. – haccks