2009-11-28 145 views
0

我有一個IP的排序結構,我需要獲取唯一IP的數量,出於某種原因,我這樣做的方式是給我一個「0」作爲結果。在這種情況下,應該有12個獨特的ips。獨特的元素 - 結構數組

包含以下元素的結構數組:

195.55.121.242 
212.80.168.34 
65.55.106.114 
65.55.207.30 
65.55.207.95 
65.55.230.237 
66.249.68.16 
66.249.68.16 
66.249.68.16 
67.195.37.172 
67.195.37.172 
67.218.116.162 
80.59.182.176 
80.59.182.176 
83.213.81.220 
83.213.81.220 
83.43.21.186 
83.43.21.186 

代碼:

typedef struct { 
    char *ip; 
}thestruct; 

qsort(mystruct, 18, sizeof(thestruct*), cmpme); 

int un = 0; 
for (i=0; i<18; i++) { 
    if (strcmp(mystruct[i++]->ip,mystruct[i]->ip)!=0) { 
     un++; 
    } 
} 

通過這樣一個簡單的得到-的strcmp只有一個元素(IP)我得到這兩個字符串相等。這告訴我strcmp將它視爲一個字符串。

我不太確定我缺少什麼。

任何幫助將不勝感激。

感謝仔細

+0

我錯過了。謝謝大家! – Josh 2009-11-28 18:25:18

回答

3

看這句話:

if (strcmp(mystruct[i++]->ip,mystruct[i]->ip)!=0) 

你比較指數i索引i(這是平等的,因爲它們是相同的),然後遞增i。 (實際上,這是未定義的行爲,因爲您正在修改i並在序列點之前多次讀取它)。

你真的想這樣做:

if (strcmp(mystruct[i + 1]->ip,mystruct[i]->ip)!=0) 

比較指數i+1索引i不接觸i,因爲ifor循環遞增。另外,i應該只從0到17而不是0到18循環,因爲您不想讀取數組的末尾。

0

不要在相同的語句中讀取和修改相同的變量。那是未定義的行爲

嘗試

for (i=0; i<18; i++) { 
    if (strcmp(mystruct[i+1]->ip,mystruct[i]->ip)!=0) { 
     i++; 
     un++; 
    } 
}