在C中重复数组

时间:2017-06-01 19:09:59

标签: c

我想知道如何在C中重复一次数组。

假设我有一个像int Array[4] = [1, 2, 3, 4]

这样的数组

是否有一种获取数组的简单方法:int Array2[8] = [1, 2, 3, 4, 1, 2, 3, 4]

Array[4]上执行某些操作?

5 个答案:

答案 0 :(得分:0)

我很确定这是一个坏主意,以后会让你感觉不舒服,但也许可以试试

#define VALUES 1, 2, 3, 4

int a[] = { VALUES, VALUES, VALUES, VALUES };

答案 1 :(得分:0)

你可以尝试这个......来了解你如何做到这一点。

for(int i=0;i<8;i++) {
  array2[i]=array[i%4];
}

答案 2 :(得分:0)

这应该是在C中重复数组的好方法,因为你的解释不是很好。模运算从[0,REPEAT]返回整数,所以在[1,REPEAT]中有+1整数。 这是代码:

#define N 5
#define REPEAT 2
int main(){
    int arr[N];
    for(int i = 0;i<N;i++){
        arr[i] = (i % REPEAT) + 1;
        printf("%d\n",arr[i]);
    }


    return 0;
}

输出:

  

1
  2
  1
  2
  1

答案 3 :(得分:0)

最简单的方法可能是使用VLA,根据需要调整大小,并使用模数运算符填充。缺点包括无法从函数返回这样的数组,以及由于某种原因无法分配VLA时的静默失败。当然,VLA是在C99中引入的,然后在C11中可选。虽然它们通常可用,但您可以选择使用下一种方法。

也许更可靠的方法是使用为新数组分配空间的函数。如果malloc()失败,则返回空指针,因此调用者有责任对此进行检查。通过它时,调用者也有free分配的责任。

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

void print_arr(size_t, int *);
int * expand_array(size_t, int *, size_t);

int main(void)
{
    int input_arr[] = {1, 2, 3, 4};
    size_t input_arr_sz = sizeof input_arr / sizeof *input_arr;
    size_t new_arr_sz = 17;

    /* Method 1: VLA */
    int new_arr_1[new_arr_sz];
    for (size_t i = 0; i < new_arr_sz; i++) {
        new_arr_1[i] = input_arr[i % input_arr_sz];
    }

    print_arr(new_arr_sz, new_arr_1);

    /* Method 2: function with malloc() */
    int *new_arr_2 = expand_array(input_arr_sz, input_arr, new_arr_sz);

    if (new_arr_2) {
        print_arr(new_arr_sz, new_arr_2);
    }

    free(new_arr_2);

    return 0;
}

void print_arr(size_t sz, int *arr)
{
    for (size_t i = 0; i < sz; i++) {
        printf("%3d", arr[i]);
    }
    putchar('\n');
}

int * expand_array(size_t input_sz, int *arr, size_t output_sz)
{
    int *new_arr = malloc(sizeof *new_arr * output_sz);
    if (new_arr) {
        for (size_t i = 0; i < output_sz; i++) {
            new_arr[i] = arr[i % input_sz];
        }
    }

    return new_arr;
}

节目输出:

  1  2  3  4  1  2  3  4  1  2  3  4  1  2  3  4  1
  1  2  3  4  1  2  3  4  1  2  3  4  1  2  3  4  1

答案 4 :(得分:0)

我明白了!

所以如果我有一个数组:int Array [4] = [1,2,3,4];

为了重复它,我使用了两个for循环:

int Array2[8];
for (int i = 0; i < 2; i++)
{
    for (int j = 0; j < 4; j++)
    {
         Array2[i*4 + j] = Array[j];
    }
}

i * 4 + j使得我可以在Array2

的分配中计算过去四