用字符串进行计数排序[核心已转储]

标签 c sorting

我需要编写一个计数排序算法,该算法按第一个字母对字符串进行排序(不管它是大写还是小写),但是在写入所有字符串后出现段错误(核心转储)错误。还有一些警告(如下)

aaa.c: In function ‘Count’:
aaa.c:20:23: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
           C[i]=(char)((int)C[i]+(int)C[i-1]);
                       ^
aaa.c:20:33: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
           C[i]=(char)((int)C[i]+(int)C[i-1]);
                                 ^
aaa.c:20:15: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
           C[i]=(char)((int)C[i]+(int)C[i-1]);
               ^
aaa.c:22:25: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
                B[(int)C[(int)A[j]]]=A[j];
                         ^
aaa.c:22:18: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
                B[(int)C[(int)A[j]]]=A[j];
                  ^
aaa.c:23:18: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
                C[(int)A[j]]=C[(int)A[j]]-1;
                  ^
aaa.c:23:31: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
                C[(int)A[j]]=C[(int)A[j]]-1;


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

#define MaxStringLength 30
#define MaxStringNumber 5
#define NumberOfLetters 26

char **A;
char **B;
char **C;

void Count(char **A, char **B, int quantity){
        int i,j;

        for (i=1;i<=NumberOfLetters;i++) C[i]=0;
        for (j=1;j<=quantity;j++)
             C[A[j][1]-96] +=1;
        for (i=2;i<=NumberOfLetters;i++)
          C[i]=(char)((int)C[i]+(int)C[i-1]);     
        for (j=MaxStringNumber;j>0;j--){
               B[(int)C[(int)A[j]]]=A[j]; 
               C[(int)A[j]]=C[(int)A[j]]-1;

        }
}

void printing(char **array, int quantity){
        int i;
        for (i=1;i<=quantity;i++)
                printf("%s \n", array[i]);
}

void reading(char **array, int quantity){
        char word[MaxStringLength];
        int i;
        for (i=1;i<=quantity; i++){
                scanf("%s",word);
                array[i] = (char*) malloc(sizeof(char)*MaxStringLength);
                strcpy(array[i],word);
        }
}

int main(){
        A=(char**) malloc((MaxStringNumber+1)*sizeof(char*));
        B=(char**) malloc((MaxStringNumber+1)*sizeof(char*));
        C=(char**) malloc((MaxStringNumber+1)*sizeof(char*));

        printf("Array A:\n");
        reading(A,MaxStringNumber);
        Count(A,B,MaxStringNumber);
        printf("Sorted:\n");
        printing(B,MaxStringNumber);

        return 0;
}

最佳答案

正如评论所述,原始代码存在几个问题。在 C 中,索引是从 0 到 size-1,而不是从 1 到 size。 C[] 需要是整数数组(或 size_t)。循环的初始值和结束值以及循环结束检查(例如 < 或 <=)需要修复。

由于一次纠正一个错误的来回量会花费太长时间,因此我创建了一个工作示例。

此示例可以正常工作,但假设输入正好有 5 行,并且所有字符均为小写。 -96 将 'a' 转换为 1,将 'b' 转换为 2,...。因此,生成计数后,C[0] = 0,C[1] = 'a' 的计数,C[2] = 'b' 的计数,...

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

#define MaxStringLength 30
#define MaxStringNumber 5
#define NumberOfLetters 26

void Count(char **A, char **B, int *C, int quantity){
int i,j;
    for (i=0;i<NumberOfLetters;i++) C[i]=0;
    for (j=0;j<quantity;j++)
         C[A[j][0]-96]++;
    for (i=1;i<=NumberOfLetters;i++)
        C[i] += C[i-1];
    for (j=MaxStringNumber-1;j>=0;j--)
        B[--C[A[j][0]-96]]=A[j]; 
}

void printing(char **array, int quantity){
int i;
    for (i=0;i<quantity;i++)
    printf("%s \n", array[i]);
}

void reading(char **array, int quantity){
char word[MaxStringLength+1];
int i;
    for (i=0;i<quantity; i++){
        scanf("%s",word);
        array[i] = (char*) malloc(MaxStringLength+1);
        strcpy(array[i],word);
    }
}

int main(){
char **A;
char **B;
int   *C;
    A=(char**) malloc((MaxStringNumber)*sizeof(char**));
    B=(char**) malloc((MaxStringNumber)*sizeof(char**));
    C=(int *)  malloc((NumberOfLetters+1)*sizeof(int *));

    reading(A,MaxStringNumber);
    printf("Array A:\n");
    printing(A,MaxStringNumber);
    Count(A,B,C,MaxStringNumber);
    printf("Sorted:\n");
    printing(B,MaxStringNumber);
    /* clean up */
    for(i = 0; i < MaxStringNumber; i++)
        free(B[i]);     /* or A[i] */
    free(C);
    free(B);
    free(A);
    return 0;
}

关于用字符串进行计数排序[核心已转储],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40732113/

相关文章:

c++ - 变量类型 global、static、local 和 auto

c - 进程和线程如何选择

c++ - 与按升序对二维数组排序相关的难题

c - __builtin_add_overflow 函数在 gcc 5 及更高版本中受支持,在 gcc 4.6 中哪些函数可以替代它?

c - 接受系统调用时出现段错误

javascript - 如何按长度排序然后按字母顺序排序

c++ - 为什么 leetcode c++ sort() 给出编译错误?

Python 从另一个列表中排序一个列表

c++ - 分析 stable_sort

c - 是否有可能告诉 gcc 编译器忽略函数属性?或者加快编译时间?