уникальные элементы - массив массивов - PullRequest
0 голосов
/ 28 ноября 2009

У меня есть отсортированная структура 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++;
    }
}

Делая простой gets-strcmp только с одним элементом (ip), я получаю, что обе строки равны. Что говорит мне, что strcmp рассматривает его как строку.

Я не совсем уверен, чего мне не хватает.

Любая помощь будет признательна.

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 ноября 2009

Посмотрите внимательно на эту строку:

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, поскольку вы не хотите читать после конца массива.

0 голосов
/ 28 ноября 2009

Не читайте и не изменяйте одну и ту же переменную в одном выражении. Это неопределенное поведение !

Попробуйте

for (i=0; i<18; i++) {
    if (strcmp(mystruct[i+1]->ip,mystruct[i]->ip)!=0) {
        i++;
        un++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...