我有一个排序的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将其视为一个字符串。
我不太确定我错过了什么。
任何帮助都会受到赞赏。
由于
答案 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
,因为i
在for
循环中递增。此外,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++;
}
}