2015-07-05 97 views
-1

我一直在嘗試處理用戶可以從中選擇的多種功能,但出於某種原因,意外的輸入不會導致開發的反應,反而會凍結。處理輸入時意外凍結

int main(){ 
    int done = 0, isModeValid = 1; 
    char nextMode[15], *options[] = {"quit", "test", "getASCII"}; 

    while(done == 0){ 
     cls(); 
     isModeValid = 0; 
     text(1); 
     currentOptions(options); 
     gets(nextMode); 
     int i = 0; 
     for(i = 0; i < (sizeof(options)); i++){ 
      if(strcmp(nextMode, options[i]) == 0){ 
       done = runMode(i); 
       break; 
      } 
      //Error seems to happen after this point 
      if(strcmp(nextMode, options[i]) != 0 && i == sizeof(options)){ 
       cls(); 
       text(3); 
       Sleep(750); 
      } 
     } 
    } 
    return 0; 
} 
void cls(){ 
    system("cls"); 
} 

回答

3

您正在調用未定義的行爲。 sizeof產生字節中參數的大小/char s,而不是數組的長度。因此,您正在遍歷數組中實際包含的更多元素,並嘗試訪問超出其邊界的元素。

使用sizeof(options)/sizeof(options[0])可以獲得與每個條目類型無關的長度。

注意:聲明數組static將在調用main之前進行分配和初始化。每次調用函數時,您的當前版本都會這樣做。雖然對於main並不重要,但對於被多次調用的其他函數而言,這將是重要的。

+0

upvoted。應該不需要計算它。如果它是靜態分配的,你就知道它的大小是多少(元素數量)。否則,如果它被動態分配....你也知道它! :) – Pynchia

+0

@Pynchia:如果在編譯時已知大小,與使用常量相比沒有任何損失。但是對於這個問題,大小是由初始化程序決定的,所以不,我們不知道實際大小,但無論如何都要計算。 (不要忘記VLA)。 – Olaf

+0

當然可以。我只是開玩笑,暗示誰分配了內存知道誰應該有辦法讓你的代碼知道 – Pynchia

0

要獲得options數字符串,你需要(sizeof(options)/sizeof(options[0])),不只是sizeof(options) ...所以你for循環是循環次數太多,而你所訪問出界。

此外,您的第二個if從不執行,因爲i永遠不會到sizeof(options)