【问题标题】:Segmentation fault (core dumped) in c [closed]c中的分段错误(核心转储)[关闭]
【发布时间】:2012-11-20 02:50:52
【问题描述】:

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

...知道为什么吗?

【问题讨论】:

  • 您应该使用所有警告和调试信息进行编译,并使用调试器。在 Linux 上,使用gcc -Wall -g 编译(改进代码直到没有给出警告)并使用gdb 进行调试。你的程序错了,因为str1 应该是一个指针数组......
  • 您是否尝试使用调试器来查看哪一行导致崩溃?
  • 你想在这里排序什么?
  • 我正在尝试对字符串中的字符进行排序
  • qsort 是 c 中的内置函数

标签: c segmentation-fault qsort


【解决方案1】:

我觉得台词

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

【讨论】:

  • 我按照您的指南进行了更改,但问题仍然存在。
  • 在更改 cmpr 后..它工作了..谢谢
【解决方案2】:

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

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

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

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

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

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

如果你只想对数组中的chars 进行排序,你应该像 Ed Heal 所说的那样使用

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

str2 类似),但您需要将 cmpr 函数更改为

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

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

【讨论】:

  • 在我更改 cmpr 后它起作用了..谢谢!
猜你喜欢
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多