-1

qsort在c中使用函数..它是一个内置函数......它适用于长度小于7的字符串..在长度> 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;
}

...知道为什么吗?

4

2 回答 2

2

我认为线条

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函数也不正确。

于 2012-12-02T13:34:06.343 回答
1

qsort(str1, len1, sizeof(char *), cmpr);

您对一组sizeof(char*) chars 块进行排序 - 这可能不是您想要的。

这样一个块的地址被传递给比较函数,

static int 
cmpr(const void *a, const void *b) { 
  return strcmp(*(char **)a, *(char **)b);
}

它被解释为指向 a 的指针char*,然后被取消引用。然后将sizeof(char*) char数组中的 s 块传递给strcmp,在那里它被解释为指向以 0 结尾的字符数组的指针。很可能不是。

比较函数看起来好像要对字符串的后缀进行排序。如果是这种情况,您需要一个指向数组的指针数组str1进行排序。

如果您只想对char数组中的 s 进行排序,则应如 Ed Heal 所说,使用

qsort(str1, strlen(str1), 1, cmpr);

(类似于str2),但您需要将cmpr功能更改为

static int cmpr(const void* a, const void* b) {
    return *(char*)a - *(char*)b;
}

然后比较各个位置的字符。

于 2012-12-02T13:38:11.763 回答