【问题标题】:Beginner to C, How can i simplify this code?C初学者,如何简化此代码?
【发布时间】:2020-10-20 05:29:15
【问题描述】:

这是一个函数,用于将两个相同大小的整数数组的元素相加并返回指向第三个数组的指针。

这是必需的/

int *addTwoArrays(int *a1, int *b1, int size);

函数应遵循以下规则:

  • 如果任何元素的总和为负,则将其设为零。
  • 如果a1和b1指向同一个数组,则返回NULL
  • 如果任何输入数组为 NULL,则返回 NULL。

我需要使用以下数组调用此函数并打印总和(在下面的情况 i、ii 的单独行中打印总和数组元素)。

案例一。

int a1[] = {1, -15, 2, 14, 3, -13, 0};
int b1[] = {0, 16, 2, -15, -3, 10, 0};

案例二。

int a2[] = {100, 101, 200, -3011};
int b2[] = {1000, 1010, -300, 10000};

我也不能使用任何外部库(除了默认的 stdio.h)

#include<stdio.h>

int sum[];

int * addTwoArrays(int * a1, int * b1, int size) {
    if (a1 == b1) {
        return NULL;
    }
    if ((a1 == NULL) || (b1 == NULL)) {
        return NULL;
    }
    for (int i = 0; i < size; i++) {
        sum[i] = 0;
    }
    for (int i = 0; i < size; i++) {
        sum[i] = a1[i] + b1[i];
    }
    printf("Sum is: ");
    for (int i = 0; i < size; i++) {
        if (sum[i] < 0) {
            sum[i] = 0;
        }
        printf("\t%d\t", sum[i]);
    }

}
int main() {
    int i;

    //for the execution of case1
    int a1[] = {1, -15, 2, 14, 3, -13, 0};
    int b1[] = {0, 16, 2, -15, -3, 10, 0};
    int size = 7;
    printf("\ncase 1:\n");
    addTwoArrays(a1, b1, size);

    //for the execution of case2
    int a2[] = {100, 101, 200, -3011};
    int b2[] = {1000, 1010, -300, 10000};
    size = 4;
    printf("\n\ncase 2:\n");
    addTwoArrays(a2, b2, size);
}

我确信有更好的方法(更紧凑的方法),但我是 c 新手,我需要尽可能地压缩它。

【问题讨论】:

  • 你在这里看什么简化?对我来说看起来不错,但是,您可以通过遵循最佳实践来使代码紧凑。
  • int sum[]; 这显然不会编译,而且你不能定义一个未知大小的全局数组。函数addTwoArrays 需要为结果动态分配数组并返回指向它的指针。
  • 不能使用stdlib.h
  • this & that == NULL 的错误处理可以通过文档留给调用者。打印(任何形式的 I/O)应该由调用者完成。

标签: arrays c pointers


【解决方案1】:

你的函数是错误的,因为你没有返回任何对象

你必须知道的第一件事是,如果你想动态构建一个数组,你必须使用

malloc

函数,但以更简单的方式,您可以将 sum 数组作为输入参数 如果我想写你的例子,我更喜欢这样写

#include <stdio.h>

int* addArray(int* sum, int* a, int* b, int len) {
    int i;
    // check input params
    if (sum == NULL ||
        a == NULL ||
        b == NULL ||
        a == b) {
        return NULL;
    }
    // calculate sum
    for (i = 0; i < len; i++) {
        sum[i] = a[i] + b[i];
        if (sum[i] < 0) {
            sum[i] = 0;
        }
    }
    return sum;
}

int main(){
    int i;
    int arr1[5] = {10, 20, 30, 40, 50};
    int arr2[5] = {-10, 100, 20, -200, 10};
    int sum[5];
    int len;

    len = sizeof(sum) / sizeof(sum[0]);

    addArray(sum, arr1, arr2, len);
    printf("Sum: ");
    for (i = 0; i < len; i++) {
        printf("%d,", sum[i]);
    }

}

并使用 malloc 函数创建动态数组,您可以看到以下代码 不幸的是,你不得不使用 stdlib.h

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

int* addArray(int* a, int* b, int len) {
    int i;
    int* sum;
    // check input params
    if (a == NULL ||
        b == NULL ||
        a == b) {
        return NULL;
    }
    sum = (int*) malloc(sizeof(int) * len);
    // calculate sum
    for (i = 0; i < len; i++) {
        sum[i] = a[i] + b[i];
        if (sum[i] < 0) {
            sum[i] = 0;
        }
    }
    return sum;
}

int main(){
    int i;
    int arr1[5] = {10, 20, 30, 40, 50};
    int arr2[5] = {-10, 100, 20, -200, 10};
    int* sum;
    int len;

    len = sizeof(arr1) / sizeof(arr1[0]);

    sum = addArray(arr1, arr2, len);
    printf("Sum: ");
    for (i = 0; i < len; i++) {
        printf("%d,", sum[i]);
    }

}

【讨论】:

  • 而不是int* sum; ... sum = (int*) malloc(sizeof(int) * len);,可以简化为int* sum = malloc(sizeof *sum * len);
  • 我不确定所有的 C 编译器都支持那行代码
【解决方案2】:

是的,但是在原始代码中,在 main 函数中,它没有获取 addTwoArrays() 函数的返回值。 所以我们可以像这样更改代码。

#include<stdio.h>
    
    void addTwoArrays(int * a1, int * b1, int size) {
        if (a1 == b1 || a1 == NULL || b1 == NULL) {
            return NULL;
        }
        printf("Sum is: "); 
        int sum;
        for (int i = 0; i < size; i++) {
           sum = a1[i] + b1[i];
            if (sum < 0) {
                sum = 0;
            }
            printf("\t%d\t", sum);
        }
    
    }

【讨论】:

    【解决方案3】:

    如果我们不能使用stdio.h以外的库,为什么“addTwoArrays”函数有一个返回值“int *”?

    假设返回值仅用于检查。 (函数是否成功。)

    #include<stdio.h>
    
    int * addTwoArrays(int * a1, int * b1, int *c1, int size) {
        if ((a1 == NULL) || (b1 == NULL)||(a1 == b1)) return NULL;
        
        int i;
    
        for (i = 0; i < size; i++) {
            c1[i] = a1[i] + b1[i];
    
            if (c[i] < 0) c[i] = 0;
        }
    
        return c1;
    }
    
    int main() {
        int i, size;
    
        //for the execution of case1
        int a1[] = {1, -15, 2, 14, 3, -13, 0};
        int b1[] = {0, 16, 2, -15, -3, 10, 0};
        int c1[7];
        size = 7;
    
        printf("Case 1:\n\tSum1:"); 
        if (addTwoArrays(a1, b1, c1, size)!=NULL) for (i=0; i<size; i++) printf(" %d", c1[i]);
        puts("");
    
        //for the execution of case2
        int a2[] = {100, 101, 200, -3011};
        int b2[] = {1000, 1010, -300, 10000};
        int c2[4];
        size = 4;
    
        printf("Case 2:\n\tSum2:"); 
        if (addTwoArrays(a2, b2, c2, size)!=NULL) for (i=0; i<size; i++) printf(" %d", c2[i]);
        puts("");
    
        return 0;
    }
    

    stdlib.h 的答案:

    #include<stdio.h>
    #include<stdlib.h>
    
    int * addTwoArrays(int * a1, int * b1, int size) {
        if ((a1 == NULL) || (b1 == NULL)||(a1 == b1)) return NULL;
        
        int i, *sum=malloc(size*sizeof(int));
    
        if (sum==NULL) return NULL;
    
        for (i = 0; i < size; i++) {
            sum[i] = a1[i] + b1[i];
    
            if (sum[i] < 0) sum[i] = 0;
        }
    
        return sum;
    }
    
    int main() {
        int i, size, *sum;
    
        //for the execution of case1
        int a1[] = {1, -15, 2, 14, 3, -13, 0};
        int b1[] = {0, 16, 2, -15, -3, 10, 0};
        size = 7;
    
        printf("Case 1:\n\tSum1: ");
        if ((sum=addTwoArrays(a1, b1, size))!=NULL){
           for (i=0; i<size; i++) printf(" %d", sum[i]);
           free(sum);
        }
        puts("");
    
        //for the execution of case2
        int a2[] = {100, 101, 200, -3011};
        int b2[] = {1000, 1010, -300, 10000};
        size = 4;
    
        printf("Case 2:\n\tSum2: ");
        if ((sum=addTwoArrays(a2, b2, size))!=NULL){
           for (i=0; i<size; i++) printf(" %d", sum[i]);
           free(sum);
        }
        puts("");
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2016-11-17
      • 2020-07-13
      • 2020-06-22
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多