2017-07-07 134 views
0

當我在這個簡單的代碼中輸入第一個分數時,代碼::塊不斷崩潰。這是一個完美的類型代碼,我的理解現在我很困惑。爲什麼Code :: Blocks在我試圖運行這段代碼時會崩潰?

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    float grade = 0; 
    float scoreEntered = 0; 
    float numtest = 0; 
    float average = 0; 

    printf("Press 0 when complete. \n\n"); 
    do { 
     printf("Test: %.0f Average: %.2f \n", numtest, average); 
     printf("\nEnter test score "); 
     scanf("%f", scoreEntered); 
     grade += scoreEntered; 
     numtest++; 
     average = grade/numtest; 
    } while (scoreEntered != 0); 

    return 0; 
} 
+1

您scanf函數的第二個參數之前忘記符號。 – yeputons

+2

'scanf(「%f」,scoreEntered);' - >'scanf(「%f」,&scoreEntered);' –

+0

您的程序可能會崩潰,但我懷疑這是導致代碼塊ide崩潰。你的頭銜似乎有誤導性。 –

回答

3
scanf("%f", scoreEntered); 

應該

scanf("%f", &scoreEntered); 

scanf預計變量的地址,當你通過變量而不是變量的地址,它最終會訪問無效的內存,導致段故障

2

你的錯誤是在第16行

它應該是

scanf("%f", &scoreEntered); 

原因

「&」用於獲取變量和「scanf()的」地址需求變量的地址存儲數據

1

問題是你逝去的scanf()值爲scoreEntered而不是其地址。你應該寫:

scanf("%f", &scoreEntered); 

請注意,編譯器可以警告你這種愚蠢的錯誤,你增加警告級別。使用gcc -Wall -Werrorclang -Weverything -Werror以獲得最大幫助。

還要注意,你應該測試返回值scanf()。如果它在單次轉換的情況下不返回1,則目標變量未被修改,並且違規輸入將保留在輸入流中,導致相同的行爲無限重複。嘗試輸入A作爲輸入並親自查看(一旦您更正了缺失的&)。

這裏是一個糾正和改進的版本:

#include <stdio.h> 

int main(void) { 
    float grade = 0; 
    float scoreEntered = 0; 
    float average = 0; 
    int numtest = 0; 

    printf("Press 0 when complete.\n"); 
    for (;;) { 
     printf("\nEnter test score: "); 
     if (scanf("%f", &scoreEntered) != 1 || scoreEntered == 0) 
      break; 
     grade += scoreEntered; 
     numtest++; 
     average = grade/numtest; 
     printf("Test: %d Average: %.2f\n", numtest, average); 
    } 

    return 0; 
}