我试图在C中对字符串数组进行排序但它无法运行。好像我误用了qsort。调用qsort时程序崩溃。我该如何修复我的代码。我应该使用const char * []而不是char [] []吗?为什么呢?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define N 40
#define MIN 4
#define MAX 10
int generateRandomNumber(int low, int high)/*generate random number between low and high inclusive*/
{
return rand() % (high + 1 - low) + low;
}
int comp(const void* a, const void* b)
{
const char* pa = *(const char**)a;
const char* pb = *(const char**)b;
return strcmp(pa, pb);
}
int main()
{
char words[N][MAX + 1];
int i, j;
int length;
srand(time(NULL));
for (i = 0; i < N; ++i)
{
length = generateRandomNumber(MIN, MAX);
for (j = 0; j < length; ++j)
{
words[i][j] = generateRandomNumber('a', 'z');
}
words[i][length] = '\0';
}
qsort(words, N, sizeof(char*), comp);
for (i = 0; i < N; ++i)
{
printf("%s\n", words[i]);
}
return 0;
}
答案 0 :(得分:1)
你没有正确投射:
int comp(const void* a, const void* b)
{
const char* pa = *(const char**)a;
const char* pb = *(const char**)b;
return strcmp(pa, pb);
}
应该是:
int comp(const void* a, const void* b)
{
const char* pa = (const char*)a;
const char* pb = (const char*)b;
return strcmp(pa, pb);
}
我不知道您的代码中是否存在其他问题,但是当您将void*
转换为const char**
时,您正在发送处理器以访问虚假的内存地址。
答案 1 :(得分:1)
您编写程序时,单词的类型为char *words[N]
(指向C字符串的指针数组)。但您的类型为char words[N][MAX + 1]
。它的平面数组,编译器可以将其转换为char words[N * (MAX + 1)]
。
所以,如果你真的想保存单词类型,那么:
qsort(words, N, sizeof(*words), comp);
int comp(const void* a, const void* b)
{
return strcmp(a, b);
}
答案 2 :(得分:0)
在字符串比较函数更改
中const char* pa = *(const char**)a;
const char* pb = *(const char**)b;
到
const char* pa = (const char*)a;
const char* pb = (const char*)b;
答案 3 :(得分:0)
const char* pa = *(const char**)a;
const char* pb = *(const char**)b;
应该是:
const char* pa = (const char*)a;
const char* pb = (const char*)b;
和
qsort(words, N, sizeof(char*), comp);
应该是:
qsort(words, N, sizeof(words[0]), comp);
第三个参数表示数组的长度