独特元素 - 结构数组

时间:2009-11-28 18:17:46

标签: c struct

我有一个排序的IP结构,我需要获取唯一IP的数量,由于某种原因我正在这样做,结果是给我一个“0”。在这种情况下,应该有12个独特的ips。

包含以下元素的struct数组:

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++;
    }
}

通过只使用一个元素(ip)执行简单的gets-strcmp,我得到两个字符串相等。这告诉我strcmp将其视为一个字符串。

我不太确定我错过了什么。

任何帮助都会受到赞赏。

由于

2 个答案:

答案 0 :(得分: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,因为您不想读取数组的末尾。

答案 1 :(得分:0)

不要在同一语句中读取和修改相同的变量。这是未定义的行为

尝试

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