我试图在 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;
}
最佳答案
您没有正确转换:
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**
时,您正在发送处理器来访问伪造的内存地址。
关于C 对字符串数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40783223/