如何解决使用 qsort 按列从最小到最大对二维数组进行排序
我正在尝试使用 qsort
从最小到最大对每一列进行排序。以输入
168.12.110.25
64.113.134.35
217.158.91.183
102.130.129.146
215.116.26.223
81.162.78.0
19.204.25.222
245.124.138.157
137.249.183.201
106.61.236.67
106.71.236.60
106.81.240.63
168.14.111.27
168.17.111.27
215.116.26.220
137.249.111.202
137.246.111.202
我想要一个类似于
的输出19.204.25.222
64.113.134.35
.
.
.
106.61.236.67
106.71.236.60
.
.
.
137.246.111.202
137.246.111.202
我正在尝试使用嵌套的 for 循环遍历每一列并告诉我一列是否大于下一列。如果代码大于 qsort 将检查并相应地移动它们,代码将遍历每个并让我现在。
我想知道我是否正确使用了 qsort
以及我的代码是否有意义。
#include <stdio.h>
#include <stdlib.h>
//declare other functions/files to be used in the program
void print_fun(void);
void read_fun(void);
static int compare(const void *a,const void *b,int arg,unsigned char networks[arg][4]);
//read command line input and store the information
int main(int argc,char **argv) {
//declar variable
int arg = 0;
//make argv into an int
arg = atoi(argv[1]);
//assign size to networks
unsigned char networks[arg][4];
//assign input to networks
for (int j = 0; j < 1; ++j) {
if (argc == 1) {
printf("ERROR ERROR,you messed up\n");
} else {
// hold network addresses in a 2-d array,with 4 unsigned char
for (int k = 0; k < arg; k++) {
for (int i = 0; i < 4; i++) {
scanf("%hhu.",&networks[k][i]);
//checks to see if scanf was working properly
//printf(" %hhu",networks[k][i]);
}
//printf("\n");
}
}
}
return (0);
}
static int compare(const void *a,unsigned char networks[arg][4]) {
const event *ae = a,*be = b;
for (int i = 0; i < arg; i++) {
for (int j = 0; j < 4; j++) {
if (ae->networks[i][j] < be->networks [i+1][j])
return -1;
else
if (ae->networks[i][j] > be->networks[i+1][j])
return 1;
}
void qsort(void networks,size_t arg,size_t 4,int(*compar)(const void*a,const void *b));
}
}
解决方法
你应该使用这样的比较函数:
#include <string.h>
int compare_quads(const void *a,const void *b) {
return memcmp(a,b,4);
}
并像这样使用它:
//read command line input and store the information
int main(int argc,char *argv[]) {
//declare variable
int arg = 0;
//make argv into an int
if (argc < 2) {
printf("usage: %s <number>\n",argv[0]);
return 2;
}
arg = atoi(argv[1]);
//assign size to networks
unsigned char networks[arg][4];
//assign input to networks
for (int k = 0; k < arg; k++) {
for (int i = 0; i < 4; i++) {
scanf("%hhu.",&networks[k][i]);
}
}
qsort(networks,arg,sizeof(networks[0]),compare_quads);
//print the networks
for (int k = 0; k < arg; k++) {
printf("%d.%d.%d.%d\n",networks[k][0],networks[k][1],networks[k][2],networks[k][3]);
}
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。