2015-11-26 109 views
0

我正在爲大學任務創建天氣報告。我正在開發一個假設打印出所有12個月數據的函數。我有一個大小爲12的數組,並且擁有12個月的名稱。當我編譯的程序中,我不斷收到以下錯誤:錯誤:字符數組初始值設定項中的元素過多

assignment3.c:149:5: error: excess elements in char array initializer 

下面是有這個陣列功能:

void printMonthlyStatistic(int month,const struct MonthlyStatistic* monthly){ 

    int i; 
    char monthNames[12] = {"January", "February", "March", "April", "May", "June", "July", "August", 
          "September", "October", "November", "December"}; 

    for (i=0;i<12;i++) { 

     printf(" %c | %.1f | %.1f | %.1f | %.1f \n",monthNames[i],monthly->maxTemperature,monthly->minTemperature,monthly->averageTemperature, 
                monthly->totalPrecipitation); 
    } 

} 
+1

它應該是'char * monthNames [12]'。 –

+0

請注意,這假定你將1月編碼爲0,將12月編碼爲11月。標準C庫在'struct tm'中執行該操作;大多數其他代碼不會。 –

+1

而不是所有建議使用const char * monthNames [12]'(這當然有效)。你也可以使用const char monthNames [12] [10] = {「January」,「February」,「March」,「April」,「May」,「June」,「July」,「August」 「,」October「,」November「,」December「};'在64位系統上,這比指針數組(96字節)加上字符串(86字節)佔用更少的空間(120字節)。 OTOH,在64位系統上,64字節左右確實沒有關係。 –

回答

1

您已經定義了一個單獨的值的數組,並且由於元素是字符串文字並且由多個字符組成,因此初始值設定項中存在多餘的元素,因此會顯示錯誤消息。

相反,您可以定義一個char*的數組,其中每個元素將指向數組中每個字符串文字的開始。

const char* monthNames[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; 

由於這些字符串可能會在你的二進制文件的只讀數據段結束。它宣稱他們const不會傷害。

+0

OP只發布了一行代碼,這是不合格的(但應該是一個聲明和一個定義)。在OP代碼中沒有12個字符指針的數組,聲明和定義之間沒有不匹配。 –

+0

好的,那麼描述這個的正確方法是什麼? –

+1

OP試圖定義一個12個字符值的數組,但提供了一個包含12個字符串的初始值設定項 –

0

在你的代碼

char monthNames[12] 

代表一個字符數組,不是一個字符串,而是一個字符。 您必須在陣列改變這樣的事情:

char* montNames[12] 

爲了有一個字符串數組,而不是一個簡單的人物。

相關問題