2012-02-21 8 views
0

저는 기본적으로 골프 게임을 만들기 위해 사용자 입력을 받고, 몇 개의 홀을 플레이하는지, 각 홀이 얼마나되는지를 묻는 숙제를 가지며, 그 홀에 무엇이 있는지를 무작위로 생성하여 인쇄합니다 아웃. 마지막에 사용자에게 다시 재생을 요청하고 예를 들어 y 또는 Y를 입력하고 아니요 등을 위해 n 또는 N을 입력하십시오. 프로그램의 모든 내용이 정상적으로 작동하지만 재생 기능을 다시 사용할 수는 있습니다. 내가 메신저를 추측함수를 다시 실행하십시오.

int main() { 
int holes, par, strokes, count = 1, low, high, go; 
char *shotName; 
go = 1; 
while (go != 0) { 
    count = 1; 
    holes = readHoles(); 
    do { 
     printf("\nHole number: %i\n", count); 
     par = readPar(holes); 
     low = 1; 
     high = par + 5; 
     strokes = calcStrokes(low, high); 
     shotName = getName(par, strokes); 
     printStatement(count, par, strokes, shotName); 
     count++; 
    }while (count <= holes); 
    go = goAgain(); 
} 
return 0; 

}

int goAgain() { 
char *temp; 
printf("\nWould you like to play again(Y/N)? "); 
scanf("%s", temp); 
while (temp != 'y' || temp != 'Y' || temp != 'n' || temp != 'N') { 
    printf("\nI am sorry that is invalid -- try again\n"); 
    printf("Would you like to play again(Y/N)? "); 
    scanf("%c", &temp); 
} 
if (temp == 'y' || temp == 'Y') { 
    return 1; 
} else { 
    return 0; 
} 

}

while 루프를 사용하여이 작업을하는 방법에 단지 혼란 : 여기 내 코드 내 주요 및 재생 다시 방법, 특히이다 또는 while 루프를 수행합니다. 이것은 작동하지만 프로그램을 실행하고 예 또는 아니오를 입력해야하는 지점에 도달하면 프로그램이 갑자기 작동하지 않게됩니다. 나는 무엇을해야할지 모른다. 기본적으로 나는 사용자가 무언가를 입력하기를 원한다. 예라면 게임을 다시하고, 그렇지 않다면 루프를 끝내고, 뭔가 다른 것이라면 오류를주고 다시 묻는다. 어떤 도움이라도 오늘 밤 기한 내게 감사드립니다! :/감사

답변

2
while (temp != 'y' || temp != 'Y' || temp != 'n' || temp != 'N') { 

온도는 모두 4 번에 그래서 이것은 항상 true 변화로 평가됩니다 그것을

+0

나는 시도하고 여전히 나던 작업 등, temp[0] == 'Y'해야합니다. 그것을 실행하면 충돌이 발생합니다. – anthony

0

&&하려면 내가 당신이 조금 루프를 정돈 도와 드리겠습니다 수 없습니다. 수업은 배운 : (! 회) (가) ... 당신은이 count+1 추한이라고 주장 할 수

for (go = 1; go ; go = goAgain() 
    holes = readHoles(); 
    for (count=0; count < holes; count++) { 
     printf("\nHole number: %i\n", 1+count); 
     /* Note: should this be: par = readpar(count+1); ? 
     ** otherwise, it would be loop-invariant 
     ** , and could be hoisted out of the loop. 
     */ 
     par = readPar(holes); 
     low = 1; 
     high = par + 5; 
     strokes = calcStrokes(low, high); 
     shotName = getName(par, strokes); 
     printStatement(count+1, par, strokes, shotName); 
    } 
} 

친구 때문이다. 이 경우 루프 조건을 for (count=1; count <= holes; count++) {으로 변경할 수 있습니다. 그러나 기억하십시오 : 그것은 표준이 아닌 관용구입니다. 은 보통으로 0부터 시작합니다.

+0

do 및 while 루프에서만이 작업을 수행해야합니다. 위선적 인 말투를 사용하지 마십시오. 미안합니다. 나는 그걸 지정해야합니다. – anthony

+0

숙제를 쓸 수없는 것 같습니다. 다른 사람이 당신을 위해 그렇게해야했습니다. – wildplasser

1

scanf 문을보십시오. 하나는 변수의 주소를 전달하지 않는 것입니다.

bool goAgain() 
{ 
    bool validInput = true; 

    char temp; 
    do 
    { 
     if (!validInput) 
     { 
      printf("\nI am sorry that is invalid -- try again"); 
     } 

     printf("\nWould you like to play again(Y/N)? "); 
     scanf("%c", &temp); // <== Make sure you pass the address of your variable 

     validInput = (temp == 'y' || temp == 'Y' || temp == 'n' || temp == 'N'); 
    } while (!validInput); 

    return (temp == 'y' || temp == 'Y'); 
} 
+0

감사합니다! 너의 것에 약간의 수정을 가해서 (즉, 임시 변통을 선언하는 동안) 그것은 완벽하게 작동한다! 완벽한 everythings – anthony

+0

@anthony 문제를 해결 한 답변이 올바른 경우이 답변을 선택하십시오. –

+0

이 답변은'temp'가'char *'대신'char'라고 선언하고'% s' 대신'c '를 사용했다면 정확할 것입니다. 그것이 그렇듯이,'scanf' 호출은 여전히 ​​완전히 틀리며, 예상치 못한 메모리에 낙서를합니다. (물론, 어쨌든'scanf'를 사용하는 것을 피하기는 어렵습니다 ...) – jamesdlin

1
char *temp; 
printf("\nWould you like to play again(Y/N)? "); 
scanf("%s", temp); 
당신은 문자열을 읽을 scanf을 요구하고

scanf는 문자열을 작성하는 주소를 필요로한다. temp으로 입력했지만 temp은 초기화되지 않았습니다. temp에 대한 메모리를 할당해야합니다. 이 순진하게 수행 할 수 있습니다 통해 : 당신의 충돌을 해결해야

char temp[1024]; 

또는

char *temp = malloc(1024); 

. 그러나 1024 바이트의 버퍼 크기는 완전히 임의적이며 사용자 입력이 해당 버퍼에 맞는지 확인할 수있는 방법이 없습니다. 특정 경우

, 당신은 대신에 대신 알 수없는 길이의 문자열의 단일 문자를 읽을 수 있습니다 : 지금 당신은 &temp으로 scanf를 호출 할 필요가

char temp; 
printf("\nWould you like to play again(Y/N)? "); 
scanf("%c", &temp); 

참고. 이유를 모르는 경우 comp.lang.c FAQ에서 Q12.12Q12.12b을 참조하십시오. However, beware of the newline left in the input buffer이 방법을 사용합니다.

일반적으로, it's best to avoid scanf entirely. scanf은 올바르게 사용하기가 매우 어렵습니다 (더 나쁜 것은 사용하기가 어렵다는 것이 분명하지 않습니다).

다른 몇 가지 : printf 호출이 fflush(stdout)가 와야합니다

  • 그것은 사용자 입력을 기다릴 때 프롬프트가 표시되는지 확인합니다.
  • temp == 'Y' 등과 비교합니다. 대신 하나의 char의 문자열 (char*를)로 temp위한 의도 않는 경우, 이러한 비교는
관련 문제