2011-07-02 33 views
0
#include <stdio.h> 

int main(void) { 
    int numStudents; 
    int i = 0 ; 

    printf("How many students are in your class? \n"); 
    scanf("%d", &numStudents); 

    int grade[numStudents]; 

    while (i > numStudents){ 
     scanf("%d", &grade[i]); 
     printf("\n"); 
     i++; 
    } 
} 

我想要它做的只是讓學生的數量,並允許許多掃描儀獲得成績。謝謝。初學者到C.開始成績簿申請

+2

使用每行代碼之前格式化(4位,或突出顯示所有內容並單擊UI中的「{}」按鈕)以使您的代碼可讀。然後告訴我們你究竟陷入了什麼位置,以及你嘗試過什麼,並提出一個問題,而不僅僅告訴我們你需要做什麼。 –

+1

另外,你可能想把'while(i> numStudents)'改爲'while(i

回答

4
while (i > numStudents){ 
    scanf("%d", &grade[i]); 
    printf("\n"); 
    i++; 
} 

你的while條件是倒退;循環體將永遠不會執行。

1

您的代碼有兩個主要問題。首先,您必須在編譯時知道數組grade的大小,或者在知道需要多少之後就必須分配它。

例如:

#define MAX_STUDENTS 100 
    int grade[MAX_STUDENTS]; 

    scanf("%d", &numStudents); 
    if (numStudents > MAX_STUDENTS) { 
     printf("Sorry, cannot handle %d students, I can only handle %d\n", 
       numStudents, MAX_STUDENTS); 
     exit(1); 
    } 

或者:

int *grade; 
    grade = malloc(sizeof(int) * numStudents); 
    if (!grade) { 
     printf("Failed to allocate memory for grades\n"); 
     exit(1); 
    } 

另一個問題是你while循環。你想迭代i < numStudents

+4

C99 VLA允許'int等級[numStudents];' – icktoofay

+1

爲了防止他使用較舊的編譯器,我拋出了該錯誤。而且,如果他只是學習C,不理解所有的陷阱就會陷入一個不好的習慣。 – unpythonic

+1

你可以在很多方面用C咬自己。許多事情都有缺陷。不妨學習如何使用它。 – icktoofay

1
while (i > numStudents){ 
    scanf("%d", &grade[i]); 
    printf("\n"); 
    i++; 
} 

i0在第一ANS numStudents大於或等於i因此i > numStudents將假在第一檢查,並且主體將不會被執行。的條件應爲:

while (i < numStudents){ 
    scanf("%d", &grade[i]); 
    printf("\n"); 
    i++; 
} 

另外你應該在塊的開頭分配存儲器之一或使用malloc分配的所需尺寸的存儲器塊

+0

C99確實允許塊中任何位置的自動變量分配。在塊的開頭讀取使用分配寫入的代碼通常更容易,但在這種情況下,跳過手動內存管理並獲取寫入的精確正確大小的數組更容易。 – sarnold

+0

,但是在這兩種情況下,我都會檢查允許的最大數量的numStudents,....如果有2G的學生(在堆棧或堆上,無所謂),這會很煩人... – ShinTakezou

+0

@ sarnold:是的C99確實允許。 – phoxis