C排序字符串数组
我正在尝试对C中的字符串数组进行排序,但它无法运行。我好像误用了qsort。调用qsort时程序崩溃。如何修复我的代码。我应该使用const char*[]而不是char[]?为什么?C排序字符串数组,c,C,我正在尝试对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 generate
#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;
}
#包括
#包括
#包括
#包括
#定义n40
#定义最小值4
#定义最大值10
int-generateRandomNumber(int-low,int-high)/*在低和高之间生成随机数,包括*/
{
返回rand()%(高+1-低)+低;
}
内部组件(常数无效*a,常数无效*b)
{
常量字符*pa=*(常量字符**)a;
常量字符*pb=*(常量字符**)b;
返回strcmp(pa,pb);
}
int main()
{
字符字[N][MAX+1];
int i,j;
整数长度;
srand(时间(空));
对于(i=0;i
您未正确铸造:
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);
}
const char* pa = (const char*)a;
const char* pb = (const char*)b;
qsort(words, N, sizeof(words[0]), comp);
我不知道您的代码中是否还有其他问题,但是当您将
void*
强制转换为const char**
时,您正在发送处理器以访问伪造的内存地址。您编写的程序就像words具有类型char*words[N]
(指向C字符串的指针数组)一样。但是您的类型是charwords[N][MAX+1]
。它的平面数组,编译器可以把它翻译成字符[N*(MAX+1)]
所以,如果您真的想保存单词类型,那么:
qsort(words, N, sizeof(*words), comp);
int comp(const void* a, const void* b)
{
return strcmp(a, b);
}
在字符串中,比较函数的更改
const char* pa = *(const char**)a;
const char* pb = *(const char**)b;
到
应该是:
int comp(const void* a, const void* b)
{
const char* pa = (const char*)a;
const char* pb = (const char*)b;
return strcmp(pa, pb);
}
const char* pa = (const char*)a;
const char* pb = (const char*)b;
qsort(words, N, sizeof(words[0]), comp);
及
应该是:
int comp(const void* a, const void* b)
{
const char* pa = (const char*)a;
const char* pb = (const char*)b;
return strcmp(pa, pb);
}
const char* pa = (const char*)a;
const char* pb = (const char*)b;
qsort(words, N, sizeof(words[0]), comp);
第三个参数表示数组的长度首先启用所有编译器警告,然后阅读手册。您可以提供有关“崩溃”和错误的更多信息吗?1)
sizeof(char*)
-->sizeof(*words)2)const char*pa=*(const char**)a;常量字符*pb=*(常量字符**)b代码>-->const char*pa=(const char*)a;常量字符*pb=(常量字符*)b为什么这个问题被标记为C++?指针的指针与二维数组没有关系。这就是代码不起作用的原因。我认为它更好:返回strcmp((char*)a,(char*)b)
@SergioFormiggini您忘记了两个castsWhy中的常量
?它在C中是冗余的。更详细地说,我会写:qsort(words,N,(sizeof*words),(int(*)(void const*,void const*)strcmp)代码>做一些测试我知道函数comp应该包含:返回strcmp(*(char**)a,*(char**)b)代码>和qsort可以是:qsort(words、sizeof(words)/sizeof(char*)、sizeof(char*)、comp
如果words的类型为char*words[N],则这是正确的。