2009-11-28 101 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++; 
    } 
}