struct-使用qsort对c字符串进行排序
我正在整理一堆IP,但由于某种原因,它们的顺序是错误的。我不太确定问题出在哪里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
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));
}