2015-12-11 210 views
2

對於一個作業,我必須用C構成一個包含多個互鎖功能的成績簿。我已經通過了前幾個沒有(太多)頭痛的問題,但是接下來就是這個問題。基本上,我正在嘗試使用字符串並將其複製到結構內部的二維數組中。我覺得我成功的風口浪尖,但strcpy一直在我的臉上扔這兩個迷人的傢伙:爲什麼我不能strcpy?

傳遞參數的strcpy 1,使指針從整數沒有投

預期「的char * 限制'但參數是'char'類型。

這是我的代碼。 gb是一個指向結構的指針。如果我沒有足夠澄清,請詢問。

int add_assignment(Gradebook *gb, const char assgn[MAX_NUMBER_OF_ASSIGNMENTS]) { 
    int i, j; 

    for(i=0; i < MAX_NUMBER_OF_ASSIGNMENTS; i++) { 
    for(j=0; j < (MAX_NAME_LEN+1); j++) { 
     strcpy(gb->assignment_names[i][j], assgn); 
    } 
    } 

    return 1; 
} 

這裏是成績簿結構:

typedef struct gradebook { 
    int number_of_students; 
    Students students[MAX_NUMBER_OF_STUDENTS]; 
    int number_of_assignments; 
    char assignment_names[MAX_NUMBER_OF_ASSIGNMENTS][MAX_NAME_LEN + 1]; 
    int scores[MAX_NUMBER_OF_STUDENTS][MAX_NUMBER_OF_ASSIGNMENTS]; 
} Gradebook; 
+0

我假設你的assignment_names是一個二維整數數組?對非字符串類型使用memcpy。發佈結構會很好。 –

+0

'strcpy'希望將字符複製到傳遞緩衝區開始地址的緩衝區中。看來,根據錯誤消息,'gb-> assignment_names [i] [j]'不是任何東西的地址。 –

+0

看起來很奇怪,您將使用'MAX_NUMBER_OF_ASSIGNMENTS'作爲賦值名稱的長度,以及賦值的最大數量。 –

回答

2

的問題是在使用兩個迴路的:

for(i=0; i < MAX_NUMBER_OF_ASSIGNMENTS; i++) { 
    for(j=0; j < (MAX_NAME_LEN+1); j++) { 
    strcpy(gb->assignment_names[i][j], assgn); 
    } 
} 

內環試圖一個字符串(assgn)複製到單一的char。你可能意味着

for(i=0; i < MAX_NUMBER_OF_ASSIGNMENTS; i++) { 
    strcpy(gb->assignment_names[i], assgn); 
} 

代替,但是這可能不是你想要的任何,其中一個分配覆蓋分配的完整列表。很難說出你在尋找什麼邏輯。

+0

heh。我不得不承認,隨着我的進展,我正在學習這一點 - 我對我想要的東西有一個總體的瞭解,但是我對如何實現它的理解甚至比我認爲的還要弱,並且你對我的尊重可能隨着每個詞而下降。 – RubberLotus

+0

但嚴重的是,感謝您的幫助。我現在會嘗試所有的建議。 – RubberLotus

1

​​是單個字符,而不是字符串。 assignment_names[i]是一個字符數組,所以你應該複製到那個。你不需要內部循環。

int add_assignment(Gradebook *gb, const char assgn[]) { 
    int i; 

    for(i=0; i < MAX_NUMBER_OF_ASSIGNMENTS; i++) { 
     strcpy(gb->assignment_names[i], assgn); 
    } 

    return 1; 
} 
+0

似乎不清楚爲什麼名爲'add_assignment'的函數會改變每個賦值的名字 –

+0

好的簡介和重點。很好的解釋 – mrwes

相關問題