简体   繁体   中英

unique elements - struct array

I have a sorted struct of IPs where I need to get the number of unique IPs, for some reason the way I'm doing it, is giving me a "0" as a result. Which in this case there should be 12 unique ips.

The struct array containing the following elements:

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

By doing a simple gets-strcmp with only one element (ip) I get that both strings are equal. Which tells me that strcmp is treating it as a string.

I'm not quite sure what I am missing.

Any help will be appreciate it.

Thanks

Look carefully at this line:

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

You're comparing index i to index i (which are equal, since they're the same) and then incrementing i . (Actually, this is undefined behavior, since you're modifying i and reading it more than once before a sequence point).

You really want to do this:

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

to compare index i+1 to index i without touching i , since i is incremented in the for loop. Also, i should only loop from 0 to 17, not 0 to 18, since you don't want to read past the end of the array.

Don't read and modify the same variable in the same statement. That's undefined behaviour !

Try

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM