2009-11-28 4 views
0

J'ai une structure triée d'adresses IP où j'ai besoin d'obtenir le nombre d'adresses IP uniques, pour une raison ou une autre comme je le fais, ce qui me donne un "0". Dans ce cas, il devrait y avoir 12 ips uniques.éléments uniques - tableau struct

Le tableau de struct contenant les éléments suivants:

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 

code:

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

En faisant simple obtient-strcmp avec un seul élément (ip) Je reçois que les deux chaînes sont égales. Ce qui me dit que strcmp le traite comme une chaîne.

Je ne suis pas sûr de ce que je manque.

Toute aide sera en mesure d'apprécier.

Merci

+0

m'a échappé. Merci à tous! – Josh

Répondre

3

Regardez attentivement cette ligne:

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

Vous comparez index i à l'index i (qui sont égaux, car ils sont les mêmes) et incrémenter puis i. (En fait, il s'agit d'un comportement indéfini, puisque vous modifiez i et que vous le lisez plus d'une fois avant un point de séquence).

Vous voulez vraiment faire ceci:

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

pour comparer l'indice i+1 à l'index i sans toucher i, puisque i est incrémentée dans la boucle for. En outre, i devrait seulement boucler de 0 à 17, pas de 0 à 18, puisque vous ne voulez pas lire après la fin du tableau.

0

Ne pas lire et modifier la même variable dans la même instruction. C'est comportement indéfini!

Essayez

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