2009-10-30 110 views
1

我有這個結構,我想我可以設置條件,如果結構指向一個NULL值。通過一個數組結構循環

這裏是我的這個例子結構簡單:

typedef struct 
{ 
    char *name; 
    char *data; 
} details_t; 


details_t emp_details [] = 
{ 
    { "peter", "lawyer" }, 
    { "john", NULL }, /* No data for john */ 
    { NULL, NULL }, /* Indicates last element in the array */ 
}; 

我想我應該遞增emp_details陣列和取消引用指針,看它是否包含在第一個數組元素的NULL。但不知道我是否正朝着正確的方向前進。

for(i=i; *emp_details; i++) 
{ 
    printf("Name: [ %s ] [ %s ]\n", emp_details[i].name, emp_details[i].data); 
} 

回答

5

有兩種不同的方法可以處理這種外觀,而且你們有兩種不同的重疊方式!

我假設你想在'name'爲NULL時停止。

for(details_t* it = emp_details; (*it).name != NULL; it++) 
    { printf("..", (*it).name, (*it).data); } 

或:

for(int i = 0; emp_details[i].name != NULL; i++) 
    { printf("..", emp_details[i].name, emp_details[i].data); } 

還有另一個替代方案。你不能在最後一個NULL,這樣做讓emp_details的大小:

int size_of_array = sizeof(emp_details)/sizeof(details_t); 

不過,我個人反對這項建議,因爲我覺得它在實踐中的脆弱。

+3

我可以建議使用' - >'而不是'(*).'嗎? – mouviciel 2009-10-30 08:49:39

+1

除了使用' - >'代替'(*).'之外,在嘗試使用它之前不要忘記檢查'it-> data!= NULL'。否則「約翰」可能會導致'printf()'(或其他)廢話。 – 2009-10-30 09:14:11

+1

@Chris Jefferson爲什麼'int size_of_array = sizeof(emp_details)/ sizeof(details_t);'脆弱?你想分享的任何個人經驗? – 2009-10-30 10:58:43

2

應該是:

for(i=0; emp_details[i].name != NULL; i++) { 
    printf("Name: [ %s ] [ %s ]\n", emp_details[i].name, emp_details[i].data); 
} 
2

你需要的是:

for(i=i; emp_details[i].name; i++) 
{ 
    printf("Name: [ %s ] [ %s ]\n", emp_details[i].name, emp_details[i].data); 
} 

(假設emp_details[i].data被允許爲空,因爲在你的數組初始化)

3

我建議:

for (i=0 ; emp_details[i].name != NULL ; i++) 
{ 
    // do something 
} 
+0

不錯,簡單:) – warren 2009-10-30 09:11:18