2011-10-01 85 views
1

我想從數組項中訪問名稱字段並打印名稱,但我遇到了問題。更改包含結構打印的陣列的值

我在callInitialize中創建了一個指針'L',並將它設置爲我命名爲'studentList'的上部結構類型List。

int callInitialize() { 

/*Initialize a List*/ 
List studentList; 
List *L; 
L = &studentList; 
Initialize(L); 

#ifdef DEBUG 
    printf("L->count after function call Initialize = %d\n", L->count); 
    printf("L->items[0].name after function call Initialize = %s\n", studentList.items[0].name); 
#endif 

return 0; 
} 

然後我調用Initialize並嘗試設置要測試的值,但這是不正確的。

void Initialize (List *L) { 
char test = "I like you"; 
L->count = 0; 
L->items[0].name = test; 
} 

我不確定爲什麼L-> items [0] .name = test;是不合適的。我得到不兼容的類型錯誤,但名稱是字符和測試是字符?

另外,一旦我改變了那個值,我會如何打印呢?我的想法是%s是正確的,因爲字段名稱的類型是char。 callIntialize作爲調試語句打印在上面。

我的結構聲明:

#define MAXNAMESIZE 20 
typedef struct { 
char name[MAXNAMESIZE]; 
int grade; 
} Student; 

typedef Student Item; 
#define MAXLISTSIZE 4 
typedef struct { 
Item items[MAXLISTSIZE]; 
int count; 
} List; 

感謝您的任何幫助。

回答

3

C中的字符串複製不能像那樣工作。字符串只是簡單的字符數組,空字符作爲最後一個元素;因此要複製一個字符串,您需要將源數組中的單個字符複製到目標數組中的相應元素。有這樣做的庫函數,如strncpy()

所以,你需要改變:

L->items[0].name = test; 

..to類似:

strncpy(L->items[0].name,test,MAXNAMESIZE); 
L->items[0].name[MAXNAMESIZE - 1] = '\0'; 

..where第二行只是確保有在最後一個空字符,萬一testMAXNAMESIZE長。

如果Studentname成員已被宣佈爲char *malloc()分配的,而不是聲明的char數組,賦值會工作,但可能不會完成你想要的東西 - 它會改變name指向與test(不是其副本)相同的字符串,並丟棄原始值,泄漏malloc() ed內存。

+0

['strncpy'不一定是空終止你的字符串!](http://stackoverflow.com/questions/1453876/why-does-strncpy-not-null-terminate) –

+0

@AdamRosenfield這就是爲什麼明確的答案null在'strncpy'之後終止它 – Dmitri