2014-02-21 41 views
0

我正在寫一個小程序,輸入由3個字母組成的國名和奧運會上該國贏得的獎牌數量,程序將不斷詢問輸入,除非輸入「結束」一詞。我寫了一個while循環來做到這一點,但是我似乎無法停止卡在c程序如何在進程中停止scanf

//Program calculate the winner of olympics based on metal input 
#include<stdio.h> 
#include<string.h> 
int main (void) 
{ 
    int maxMedals=0, tempGold=0, tempSilver=0, tempBronze=0,tempSum; 
    char country[3]; 
    char winner[3]; 
    printf("\no o o O L Y M P I C o o o"); 
    printf("\n o o  S C O R E S  o o\n"); 
    printf("Enter country code, # gold, # silver, # bronze\n"); 
    while ((strcmp(country,"end"))!=0) 
    { 
     printf("==>"); 
     scanf("%s %d %d %d",&country, &tempGold, &tempSilver, &tempBronze); 
     tempSum=tempGold+tempSilver+tempBronze; 
     if (maxMedals<tempSum) 
     { 
      maxMedals = tempSum; 
      strcpy(winner, country); 
      // printf("\n %s", winner); 
     } 
     else 
     { 
      maxMedals=maxMedals; 
     } 
    } 
    printf("\nwe reached here\n"); 
    printf("\nWinner is %s with %d medals\n", country, maxMedals); 

    return 0; 
} 
+0

在這個程序的情況下,即使在我輸入結尾時它也不會停止,因爲它仍然會要求3個額外的整數輸入作爲分數,無論如何,當它檢測到該單詞時「scan short」scanf 「end」已輸入 – nanobots

+0

您必須使用單獨的'scanfs'而不是'fgets'來獲取國家/地區。 – Rohan

+0

@ user2948725只需在'country'之前刪除'&',那麼每件事都可以。 –

回答

0
scanf("%s",&country); 
if (strcmp(country,"end") == 0) 
    break; 
scanf("%d %d %d", &tempGold, &tempSilver, &tempBronze); 

希望這種變化的作品。首先你得到的國家的輸入,如果它不是end那麼它繼續獲得其他選項。即使將四個參數輸入一行,這也是可行的。

+1

'scanf(「%s」,&country);'不是'scanf(「%s」,country);' –

+0

不需要在'scanf()'中使用'&'作爲'country'。 – Rohan

+0

你的意思是我必須將scanf分成兩個互相疊加的scanf,如果我們假設其中一個探測到「結束」,那麼我將該程序縮短了? – nanobots

1

問題是country只有3個字符長。在C中,scanf寫入一個十六進制0字符來指示字符串的結尾,並且strcmp將字符串一直到十六進制0(至少直到字符串不同)爲止,所以至少需要4個字符用於"end"

通過只有空間3和寫3 +十六進制0,你溢出到未知的內存,造成undefined behaviour。通過在我的機器上打印country,它會打印"endend",意思是winner在內存中看起來就在country之後,所以它會打印這兩個文件,因爲printf也會繼續,直到它找到一個十六進制0,但是,由於這是未定義的行爲,因此行爲無法保證,並且在不同的編譯器上可能會有所不同。

嘗試使它4個字符:

char country[4]; 

此外,你的循環是不正確的 - 你仍然處理"end"因爲你只處理之後檢查這一點。

處理這個問題的方法有兩種:

  • 把一個if語句的scanf後立即檢查「結束」,這將break
  • 將一個scanf之前的while循環中,並在while循環(SO 2相同scanf的)的端部
+0

,但是在我掃描值後字符串中的值不會保留在那裏嗎?所以下一次當它運行while循環時,它會檢測到結束並停止它?只是想知道 – nanobots

+0

閱讀「結束」時,你會去掃描,處理,停止。如果你不介意處理「結束」,你不需要改變你的循環。 – Dukeling

0

您可以打破你scanf如下。所以,當你輸入「end」你會出while

scanf("%s",country); 
if(strcmp(country,"end")==0) 
    break; 

scanf("%d %d %d",&tempGold, &tempSilver, &tempBronze); 
0

您與「結束」您輸入之前,比較country當你輸入end 1 1 1,你的程序將停止。但是,由於countrywinner被聲明爲char country[3];char winner[3];,因此C代碼中的字符串最後需要額外的\0作爲終端字符,因此您的代碼可能會導致緩衝區溢出。如果您只需輸入一個「結束」即可終止程序,只需按照您的說法拆分scanf即可。

+0

是啊我注意到,太耶這是假設只有國家的官方3字母縮寫將被輸入耶我將不得不修復程序通過拆分scanf它似乎 – nanobots

+0

@ user2948725即使只有3個字母,你至少需要4個字符。 – jfly