Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
struct-使用qsort对c字符串进行排序_C_Sorting_Struct - Fatal编程技术网

struct-使用qsort对c字符串进行排序

struct-使用qsort对c字符串进行排序,c,sorting,struct,C,Sorting,Struct,我正在整理一堆IP,但由于某种原因,它们的顺序是错误的。我不太确定问题出在哪里 66.249.71.3 190.148.164.245 207.46.232.182 190.148.164.245 190.148.164.245 202.154.114.253 190.148.164.245 190.148.164.245 66.249.71.3 190.148.164.245 202.154.114.253 这就是我给他们分类的方法 ty

我正在整理一堆IP,但由于某种原因,它们的顺序是错误的。我不太确定问题出在哪里

66.249.71.3      
190.148.164.245  
207.46.232.182   
190.148.164.245  
190.148.164.245  
202.154.114.253
190.148.164.245  
190.148.164.245  
66.249.71.3      
190.148.164.245  
202.154.114.253
这就是我给他们分类的方法

typedef struct {
    char *ip;
} mystruct;

/* qsort */
int struct_cmp(const void *a, const void *b)
{
    mystruct *ia = (mystruct *)a;
    mystruct *ib = (mystruct *)b;
    return strcmp(ia->ip, ib->ip);
} 
...
qsort(a_struct, 11, sizeof(mystruct*), struct_cmp);
for(..){
    printf("%s\n",a_struct[i]->ip);
}

任何帮助都将不胜感激。谢谢

您正在将IP地址排序为字符串。如果它们被规范化,这实际上是可行的:如果您想让它起作用,应该使用
066.249.071.003
而不是
66.249.71.3

我认为最好的办法是使用一个函数,将虚线IP地址转换为32位整数,然后使用得到的整数作为排序键对其进行排序

您应该能够使用
inet\u addr()
进行此转换。将此添加到您的程序中:

#include <arpa/inet.h>

#include.

您有一个指向
mystruct
s的指针数组,但是使用此比较函数的
qsort
需要一个简单的
mystruct
s数组。要对
mystruct*
数组进行排序,需要向比较函数添加另一个间接级别:

int struct_cmp(const void *a, const void *b) {
    mystruct *ia = *(mystruct **)a;
    mystruct *ib = *(mystruct **)b;
    return strcmp(ia->ip, ib->ip);
}

修复排序代码至少有两种方法。一种是修改comparator函数以匹配对qsort()的调用;另一个是修复对qsort()的调用以匹配比较器。正确的修复取决于数组的定义,但最简单的声明是结构数组(而不是结构指针数组)。因此,此工作代码使用原始比较器,但对qsort()的调用不同:

#包括
#包括
类型定义结构{
字符*ip;
}我的结构;
静态mystruct a_struct[]=
{
"66.249.71.3",
"190.148.164.245",
"207.46.232.182",
"190.148.164.245",
"190.148.164.245",
"202.154.114.253",
"190.148.164.245",
"190.148.164.245",
"66.249.71.3",
"190.148.164.245",
"202.154.114.253",
};
/*qsort*/
静态int结构(常量无效*a,常量无效*b)
{
mystruct*ia=(mystruct*)a;
mystruct*ib=(mystruct*)b;
返回strcmp(ia->ip,ib->ip);
}
静态无效打印列表(mystruct*list,int n)
{
int i;
对于(i=0;i

这就给我们留下了一个字母数字排序的值数组,所有的“190.x.y.z”地址都出现在其他地址之前,等等。这需要一个更复杂的比较器——史蒂夫哈在他的回答中描述了一个解决方案。

你给出了输入或输出的示例吗?实际上这就完成了。谢谢Josh,如果您尝试在调试器中运行代码,或者在
struct\u cmp()
函数中添加对
printf()
的调用,您可能会注意到,当指针出错时,IP地址是垃圾。所以,一个很好的调试技巧是:当事情发生异常时,确保指针指向您认为它们指向的地方!:-)吹毛求疵:你在这里表现得不稳定,因为你在抛弃这种稳定。它应该是
mystruct*ia=*(mystruct*const*)a
等等,尽管在这种情况下没有造成任何伤害。我同意我忽略了主要问题。但一旦他使用了sth的答案,他就会发现排序很奇怪,因为这个问题,所以实际上两个答案放在一起是最好的解决方案。
#include <stdlib.h>
#include <stdio.h>

typedef struct {
    char *ip;
} mystruct;

static mystruct a_struct[] =
{
    "66.249.71.3",
    "190.148.164.245",
    "207.46.232.182",
    "190.148.164.245",
    "190.148.164.245",
    "202.154.114.253",
    "190.148.164.245",
    "190.148.164.245",
    "66.249.71.3",
    "190.148.164.245",
    "202.154.114.253",
};

/* qsort */
static int struct_cmp(const void *a, const void *b)
{
    mystruct *ia = (mystruct *)a;
    mystruct *ib = (mystruct *)b;
    return strcmp(ia->ip, ib->ip);
}

static void print_list(mystruct *list, int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("%2d: %s\n", i, list[i].ip);
}

#define DIM(x)  (sizeof(x)/sizeof(*(x)))

int main(void)
{
    print_list(a_struct, DIM(a_struct));
    qsort(a_struct, DIM(a_struct), sizeof(mystruct), struct_cmp);
    print_list(a_struct, DIM(a_struct));
}