使用stdlib的qsort()对字符串数组进行排序

And*_*ndy 8 c arrays string qsort segmentation-fault

一些前言:我是一名计算机工程专业的学生,​​经过3个学期的Java(直到数据结构),在C学习第一堂课.这个问题与家庭作业有关,但是为我解决了一些步骤.

我有一个输入文件,我读入内存,它存储在char [9] [500].我读入最多500个最大长度为8的字符串.我试图使用stdlib内置的qsort()函数对这个数组进行排序,并且有一些内存错误.

重要的代码片段:

char data[4][500][60];
char debug[500][9];
size_t count = 0;

/* initialize file, open for reading */
FILE* pUserlog;
pUserlog = fopen("userlog","r");

while(!feof(pUserlog))
{
    fscanf(pUserlog, "%9s %8s %16s",debug[count], data[1][count], data[2][count]);
    fgets(data[3][count], 60, pUserlog);
    count++;
}
Run Code Online (Sandbox Code Playgroud)

此部分将数据读入阵列.这部分感兴趣的数组是"debug".这是上面指定的数组.这是我的qsort比较函数:

int compare(const void* a, const void* b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    puts("I'm in compare!");
    return strncmp(*ia, *ib,8);
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试调用qsort:

size_t debug_len = sizeof(debug)/sizeof(char*);
printf("debug len: %d, count: %d, sizeof(char*): %d\n",debug_len,count,sizeof(char*));
qsort(debug,count, sizeof(char *), compare);
Run Code Online (Sandbox Code Playgroud)

我尝试在我的调用中替换debug_len,其中count是,但我仍然是segfaulting.这是输出:

$ ./test
debug len: 1125, count: 453, sizeof(char*): 4
I'm in compare!
Segmentation fault (core dumped)

谢谢!

Jef*_*ado 9

compare函数将接收指向要比较的元素的指针.您正在尝试使用比较字符strncmp().由于您有指向每个字符串的指针,因此将其强制转换为a char *并进行比较.

int compare(const void* a, const void* b)
{
    const char *ia = (const char *)a;
    const char *ib = (const char *)b;
    puts("I'm in compare!");
    return strncmp(ia, ib, 9);
}
Run Code Online (Sandbox Code Playgroud)

还要记住,它是一个数组数组,而不是一个指针数组.所以元素的大小应该是数组的大小,9而不是指针的大小4.此时,sizeof debug[0]由于它是一个二维数组,因此更容易使用.如果你没有使用正确的尺寸,qsort()只会破坏你的阵列.

size_t elemsize = sizeof debug[0];      /*   9 - size of each element */
size_t count = sizeof(debug)/elemsize;  /* 500 - number of elements in array */
qsort(debug, count, elemsize, compare);
Run Code Online (Sandbox Code Playgroud)