c中的分段错误(核心转储)



我在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;
}

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

相关内容

  • 没有找到相关文章

最新更新