代码给出运行时错误?

时间:2015-11-17 14:36:43

标签: c

i am trying to solve leetcode question :-

https://leetcode.com/problems/largest-number/ 给定一个非负整数列表,将它们排列成最大数字。

例如,给定[3,30,34,5,9],最大形成数为9534330。 我试图通过定义比较器来对字符串进行排序,以通过从右到左或从左到右的方式来比较字符串。

该程序给出了运行时错误。请帮帮....

int comp(const void* a, const void* b){
        int p = *((int *)a);
        int q = *((int *)b);
        int size = 14;
        char * first = (char *)malloc(size * sizeof(char));
        char * second = (char *)malloc(size * sizeof(char));
        first[0] = "\0";
        second[0] = "\0";
        sprintf(first, "%d",p);
        sprintf(first, "%d",q);
        sprintf(second, "%d",q);
        sprintf(second, "%d",p);
        return -1*strcmp(first, second);
    }

    char* largestNumber(int* nums, int numsSize) {
        if(numsSize <=0)
            return NULL;
        qsort(nums, numsSize, sizeof(int), comp);
        char * result = (char*)malloc(numsSize *5*sizeof(char));
        int i;
        for(i=0; i<numsSize; i++)
            result = strcat(result, nums[i]);
        return result;
    }

1 个答案:

答案 0 :(得分:1)

  • 使用malloc()分配内存并将其丢弃是一种不好的做法。 由于您始终在comp中分配固定数量的内存,因此请使用常规数组。
  • 不要first[0] = "\0";,它指定一个指向char变量的指针。 同时删除无用的sprintf,其结果很快就会被覆盖。
  • 如果int有4个字节,则为每个元素分配5个字节可能太小。分配更多内存。
  • 初始化result指向的缓冲区,然后将其传递给strcat()
  • 在将整数传递给strcat()之前将整数转换为字符串。
  • 他们说you shouldn't cast the result of malloc() in C

可能的修复(未测试):

int comp(const void* a, const void* b){
    int p = *((int *)a);
    int q = *((int *)b);
    char first[14];
    char second[14];
    sprintf(first, "%d", q);
    sprintf(second, "%d", p);
    return -1 * strcmp(first, second);
}

char* largestNumber(int* nums, int numsSize) {
    if(numsSize <= 0)
        return NULL;
    qsort(nums, numsSize, sizeof(int), comp);
    char * result = malloc(numsSize * 14 * sizeof(char));
    int i;
    result[0] = '\0';
    for(i = 0; i < numsSize; i++) {
        char num[14];
        sprintf(num, "%d", nums[i]);
        result = strcat(result, num);
    }
    return result;
}