在黑客排名中显示细分错误

时间:2019-01-04 11:04:25

标签: c

下面是编译器(Hackerrank c编译器)显示的错误。这里是一个指针,并通过malloc分配了内存块的起始地址,并在运行时给了输入字符串。

GDB trace:
Reading symbols from solution...done.
[New LWP 4659]
Core was generated by `solution'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  main () at solution.c:22
22      if ((a[i] != a[j]) && (i >= 0 && j < n)) {
#0  main () at solution.c:22

我的代码是

#include <stdio.h>
#include <stdlib.h>
int main() {
    int n, k, i, j, mid;
    char *a;
    int *l;
    a = (char *)malloc((n + 1) * sizeof(char));
    scanf("%d", &n);
    scanf("%d", &k);
    scanf("%s", a);
    mid = (0 + (n - 1)) / 2;
    if (n % 2 == 0) {
        i = mid;
        j = mid + 1;
        l = (int *)malloc((n / 2) * sizeof(int));
    } else {
        i = mid;
        j = mid;
        l = (int *)malloc((n / 2 + 1) * sizeof(int));
    }

    while (k != 0) {
        if ((a[i] != a[j]) && (i >= 0 && j < n)) {
            if (a[i] > a[j]) {
                a[j] = a[i];
                k--;
                i--;
                j++;
            } else {
                a[i] = a[j];
                k--;
                i--;
                j++;
            }
        }
    }
    printf("%s", a);
}

1 个答案:

答案 0 :(得分:4)

if ((a[i] != a[j]) && (i >= 0 && j < n))中,条件是相反的。首先检查a[i]a[j]的索引,然后再检查ij对索引a有效。这意味着,如果i和/或j无效,则您已经使用了它们。尝试将顺序反转为if ((i >= 0 && j < n) && (a[i] != a[j]))

编辑:其他明显的问题(现在发布了更多代码):

  • n用作malloc的参数,然后进行初始化
  • 您没有限制scanf("%s", a);的长度
  • 如果i期间j和/或k != 0超出范围,则循环永远不会终止
  • 如果a[i] == a[j]期间k != 0,则循环永远不会终止

通常的nitpicks:

  • 不要转换malloc的返回值
  • sizeof(char)根据定义始终为1,乘以则毫无意义