2012-02-21 94 views
0

我有一個家庭作業任務,基本上需要用戶輸入來創建一個高爾夫遊戲,詢問要打多少個洞,每個洞有多少個標準桿,然後隨機生成該人在該洞上獲得的內容,然後將其打印出來出。最後,它要求用戶再次播放,輸入Y或Y代表是,N或N代表否,等等。我的程序中的所有內容都可以正常工作,除非我不能再次播放功能。這裏是我的代碼,特別是我的主要好戲再次方法:再次玩功能c

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; 
} 

}

我猜IM如何使用while循環,使這項工作只是困惑或做while循環。這是有效的,但是當我運行程序併到達必須輸入yes或no的點時,我輸入的任何內容都會導致程序突然崩潰。我不知道該怎麼做。基本上,我希望用戶輸入一些東西,如果它是肯定的,再次玩整個遊戲,如果沒有,結束循環,如果它的其他東西,給他們一個錯誤,並再次提示他們。任何幫助表示讚賞今晚晚上! :/感謝

回答

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

溫度不能全部4一下子讓這將始終爲true,將其更改爲&&

+0

我想,它仍然不起作用。在運行它崩潰.... – anthony 2012-02-21 00:46:11

0

讓我來幫你收拾回路一點。教訓:對()是你的朋友?

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); 
    } 
} 

你可能會認爲,count+1是醜陋(兩次!)。在這種情況下,你可以改變循環條件:for (count=1; count <= holes; count++) {。但請記住:那是非標準的成語。計數通常從零開始。

+0

我應該這樣做只與do和while循環。不能用於循環抱歉,我應該指定 – anthony 2012-02-21 00:48:05

+0

看來你不允許使用作業標籤。其他人必須爲你做這件事。 – wildplasser 2012-02-21 08:29:52

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

謝謝!稍微修改一下你的,(即宣佈溫度外的做),它完美的作品!凡事完美謝謝 – anthony 2012-02-21 01:34:41

+0

@anthony請選擇這個答案作爲正確的答案,如果這是解決您的問題。 – 2012-02-21 03:17:30

+0

如果你將'temp'聲明爲'char'而不是'char *',並且使用'%c'而不是'%s',這個答案是正確的。事實上,scanf調用仍然是完全錯誤的,它正在內存中塗寫它不應該寫的內容。 (當然,使用'scanf'很難避免這麼做......) – jamesdlin 2012-02-21 04:40:41

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字節的緩衝區大小完全是任意的,您無法保證用戶的輸入將適合該緩衝區。

你的具體情況,而不是你能讀一個字符,而不是未知長度的字符串:

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

注意,現在你需要調用scanf&temp。 (如果您不明白爲什麼,請參閱comp.lang.c FAQ中的Q12.12Q12.12b。)However, beware of the newline left in the input buffer使用此方法。

一般而言,it's best to avoid scanf entirelyscanf難以置信地難以正確使用(更糟糕的是,這很難使用)。

一些其他的東西:

  • printf調用應遵循fflush(stdout),以確保在等待用戶輸入時的提示出現。
  • 比較temp == 'Y'等等。如果你打算爲temp是不是一個單一的char一個字符串(char*),那麼這些比較需要是temp[0] == 'Y'