我在c中使用qsort
函数。这是一个内置函数...它适用于长度小于 7..on 长度> 7 的字符串,它给出"分段错误(核心转储)"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
static int cmpr( const void *a, const void *b) {
return strcmp( *(char **)a, *(char **)b);
}
int main()
{
int t;
char str1[MAX],str2[MAX];
scanf("%d",&t);
while(t--)
{
scanf("%s %s",str1,str2);
int len1=strlen(str1)/sizeof(char *);
int len2=strlen(str2)/sizeof(char *);
qsort(str1, len1, sizeof(char *), cmpr);
qsort(str2, len2, sizeof(char *), cmpr);
if((strstr(str1,str2)!=NULL)&& (strlen(str1)==strlen(str2)))
printf("YES");
else if((strstr(str2,str1)!=NULL) && (strlen(str1)==strlen(str2)))
printf("YES");
else if((strstr(str2,str1)!=NULL) && (strlen(str1)!=strlen(str2)))
printf("NO");
else if((strstr(str1,str2)!=NULL) && (strlen(str1)!=strlen(str2)))
printf("NO");
else
printf("YES");
}
return 0;
}
。知道为什么吗?
我认为这些行
int len1=strlen(str1)/sizeof(char *);
int len2=strlen(str2)/sizeof(char *);
应改为
int len1=strlen(str1);
int len2=strlen(str2);
那么以下内容可能应该改变
qsort(str1, len1, sizeof(char), cmpr);
qsort(str2, len2, sizeof(char), cmpr);
由于我们没有用于qsort
的代码,因此我冒昧地猜测cmpr
函数也是不正确的。
in
qsort(str1, len1, sizeof(char *), cmpr);
你对 sizeof(char*)
char
s 的块数组进行排序 - 这可能不是你想要的。
这种块的地址被传递给比较函数,
static int
cmpr(const void *a, const void *b) {
return strcmp(*(char **)a, *(char **)b);
}
其中,它被解释为指向char*
的指针,然后取消引用。然后数组中的 sizeof(char*)
char
s 块被传递给 strcmp
,在那里它被解释为指向以 0 结尾的字符数组的指针。很可能不是。
比较函数看起来好像要对字符串的后缀进行排序。如果是这种情况,则需要一个指向数组的指针数组str1
进行排序。
如果你只想对数组中的char
进行排序,你应该像 Ed Heal 所说的那样,使用
qsort(str1, strlen(str1), 1, cmpr);
(与str2
类似),但您需要将cmpr
函数更改为
static int cmpr(const void* a, const void* b) {
return *(char*)a - *(char*)b;
}
然后比较各个位置的字符。