2013-03-07 37 views
0

我想通過讓用戶在提示後輸入數組的大小來確定數組的大小(因爲我不知道我會有多少個等級測試)...C - 使用未定義的值聲明一個數組

它不似乎喜歡那裏scanf ("%c",&grades[i]);

這裏是全功能的線路:

#include <stdio.h> 

int main (void) 
{ 
int numGrades; 
char grades; 
char i; 
int x; 


printf ("Enter The Amount Of Numbers In Your Array: "); 
scanf("%i", &numGrades);/*Stores Amount Of Grades In The Array*/ 

for (x = 0; x < numGrades; ++x) 
    { 
    printf ("\nEnter the grade: "); 
    scanf ("%c",&grades[i]); 
    } 

return 0; 
} 

如何傳遞數組的大小作爲參數,這樣我可以接受任何大小的數組? (我將添加一個函數,將所有的成績,並結合他們在一起的信函)

+0

將'char grades'改爲'char * grades'。在'scanf'之後,執行此操作。 'grades = malloc(numGrades);' – sgarizvi 2013-03-07 06:33:36

+1

'grades'應該是一個數組(或者指向char的指針),而不是單個'char' – uba 2013-03-07 06:33:38

+0

等級被定義爲單個字符 – Vineet1982 2013-03-07 06:34:54

回答

3

你有兩個選擇:

scanf("%i", &numGrades); 
char grades[numGrades]; 
  • 如果沒有,那麼你必須動態:

    1. 如果你的編譯器支持C99變長數組,你可以你的尺寸後聲明數組在堆上分配陣列:

      scanf("%i", &numGrades); 
      char *grades = malloc(numGrades * (sizeof *grades)); 
      
  • +0

    'sizeof(char)'是1. – 2013-03-07 06:36:12

    +0

    我只是注意到,從用戶輸入創建的VLA是一個可怕的想法(如果不是一般的可怕想法...)。使用'malloc'。另外,'sizeof(char)'被定義爲始終爲'1'。 – 2013-03-07 06:36:30

    +2

    在未經檢查的用戶輸入大小上創建的VLA是一個壞主意。如果你已經檢查了大小的正確性(嚴格正面 - 不是零,也不是負面 - 對於「太大」的一些模糊定義,也許不是太大,可能是4 KiB或64 KiB),那麼就不可能有任何傷害。 – 2013-03-07 06:40:23

    2

    你宣稱grades作爲一個單一的char,而不是一個數組。無論是移動的聲明,你numGrades讀取之後,並使其成爲VLA,就像這樣:

    char grades[numGrades]; 
    

    或者使用動態分配:

    char *grades = malloc(numGrades); 
    

    如果你選擇後者,請不要忘記free()它。