我的代码崩溃了,我不知道为什么

时间:2019-02-14 13:24:13

标签: c string

所以我为家庭作业编写了这段代码。它的作用是接收n个字符串,一个规则编号,然后打印根据该规则编号排序的字符串:1表示字典顺序,2表示按字母多样性排序。我的问题是,尽管字符串仍在有效长度内,但当输入较大时会崩溃。

我的主要功能是比较和排序。

int CompareStrings(char* str1, char* str2, int rule)
{
    if(rule==LEX )
    {
        int n=strlen(str1);
        int m=strlen(str2);
        char* tmp1=(char*)malloc(sizeof(char)*(n+1));
        char* tmp2=(char*)malloc(sizeof(char)*(m+1));
        for(int i=0; i<n; i++)
        {
            tmp1[i]=make_lower(str1[i]);
        }
        for(int i=0; i<m; i++)
        {
            tmp2[i]=make_lower(str2[i]);
        }
        int result=strcmp(tmp1,tmp2);
        return result;
        free(tmp1);
        free(tmp2);
    }
    else
    {
        int x,y,c=0,i=0,count[26] = {0}, count2[26] = {0},m=0,n=0;
        while (str1[c] != '\0')
        {
            if (make_lower(str1[c]) >= 'a' && make_lower(str1[c]) <= 'z')
            {
                x = str1[c] - 'a';
                count[x]++;
            }

            c++;
        }
        for (c = 0; c < 26; c++)
        {
            if(count[c]!=0)
                n++;
        }

        while (str2[i] != '\0')
        {
            if (make_lower(str2[i]) >= 'a' && make_lower(str2[i]) <= 'z')
            {
                y = str2[i] - 'a';
                count2[y]++;
            }

            i++;
        }
        for (i = 0; i < 26; i++)
        {
            if(count2[i]!=0)
                m++;
        }
        return n-m;

    }
}

int bubble(char* a[], int n,int rule)
{
    int i, swapped = 0;
    for (i = 1; i < n; ++i)
        if (CompareStrings(a[i],a[i-1], rule)<0)
        {
            swap(a[i], a[i-1]);
            swapped = 1;
        }
    return swapped;
}


void SortStrings(char* str_arr[], int n, int rule)
{

    int not_sorted = 1;
    while ((n > 1) && not_sorted )
        not_sorted = bubble(str_arr, n--,rule);
}

它崩溃的输入例如是: 5个字符串

-abcdefghijklmnopqrstuvwxyz
-abcdefghijklmnopqrstuvwxy
-abcdefghijklmnopqrstuvwx
-abcdefghijklmnopqrstuvw
-abcdefghijklmnopqrstuv

和规则2(字母的多样性)

哦,MAX_LEN设置为30

1 个答案:

答案 0 :(得分:0)

此:

    int n=strlen(str1);
    int m=strlen(str2);
    char* tmp1=(char*)malloc(sizeof(char)*(n+1));
    char* tmp2=(char*)malloc(sizeof(char)*(m+1));
    for(int i=0; i<n; i++)
    {
        tmp1[i]=make_lower(str1[i]);
    }
    for(int i=0; i<m; i++)
    {
        tmp2[i]=make_lower(str2[i]);
    }
    int result=strcmp(tmp1,tmp2);
    return result;
    free(tmp1);
    free(tmp2);

损坏,副本不终止。在未终止的字符串上调用strcmp()是崩溃的一种好方法。

此外,代码也存在一些问题:

  1. nm应该是const
  2. 分配应该仅为char *tmp1 = malloc(n + 1);,不能进行强制转换,也不能按sizeof (char)进行缩放,这毫无意义。
  3. result也应该是const
  4. free()调用移至return之前,否则它们将永远不会执行。