char数组上的stdlib.h qsort()在c中崩溃

时间:2018-06-04 14:48:47

标签: c

#include <stdio.h>
#include <stdlib.h>

int cmpfunc(const void *a, const void *b) {
   const char *ia = (const char*)a;
   const char *ib = (const char*)b;
   return *ia - *ib;
}

int is_permutation(char *s1, char *s2){
    int i, n1, n2;


    n1 = sizeof(s1)/sizeof(s1[0]);
    n2 = sizeof(s2)/sizeof(s2[0]);


    if(n1 != n2){
        return 0;
    }


    qsort(s1, n1, sizeof(s1), cmpfunc);
    qsort(s2, n2, sizeof(s2), cmpfunc);

    for (i = 0; i < n1;  i++)
       if (s1[i] != s2[i])
         return 0;

    return 1;
}

int main(){
    char s1[5] = "check";
    char s2[5] = "check";

    printf("%d", is_permutation(s1,s2));

    return 0;
}

它只是在没有编译器错误的情况下崩溃。我已经检查过并且qsort崩溃了程序,其他一切似乎都正常工作。有什么帮助吗?

我使用&#34; gcc -g -ans--pedantic -Wall prog.c -o prog&#34;

编译

2 个答案:

答案 0 :(得分:3)

sizeof(s1)&amp; c。 是数组中元素数量的函数。这是因为s1已将衰减指针类型。

strlen可用于获取字符串的长度,但您需要编写

char s1[6] = "check";

或更好,

char s1[] = "check";

为NUL终结符留出空间。

答案 1 :(得分:0)

我已经检查过并且qsort崩溃了程序,其他一切似乎都正常工作。 ?不,在调试器中运行?尝试使用-g选项进行编译并运行gdb并执行bt

有问题的陈述是

n1 = sizeof(s1)/sizeof(s1[0]); /* it will results in 4/1 that is 4 */
n2 = sizeof(s2)/sizeof(s2[0]);

而是在s1内旋转循环并查找长度,或使用strlen()查找s1s2的长度为

for(n1 = 0;s1[n1]!='\0'; n1++); /* dummy loop, at the end of loop, n1 will be length of s1 */
for(n2 = 0;s2[n2]!='\0'; n2++);

并且

qsort(s1, n1, sizeof(s1[0]), cmpfunc);
qsort(s2, n2, sizeof(s2[0]), cmpfunc);

以下是示例is_permutation()函数

int is_permutation(char *s1, char *s2){
        int i, n1, n2;
        for(n1 = 0;s1[n1]!='\0'; n1++); /* dummy loop, at the end of loop, n1 will be length of s1 */
        for(n2 = 0;s2[n2]!='\0'; n2++);

        if(n1 != n2){
                return 0;
        }
        qsort(s1, n1, sizeof(s1[0]), cmpfunc);
        qsort(s2, n2, sizeof(s2[0]), cmpfunc);

        for (i = 0; i < n1;  i++)
                if (s1[i] != s2[i])
                        return 0;

        return 1;
}

最重要的是char s1[5]="check"没有\0字符的空间。因此,要么char s1[6]char s1[]= "check"