簡體   English   中英

在C中重復數組

[英]Repeating an Array in C

我想知道如何在C中重復數組多次。

假設我有一個類似的數組: int Array[4] = [1, 2, 3, 4]

有沒有簡單的方法來獲取數組: int Array2[8] = [1, 2, 3, 4, 1, 2, 3, 4]

通過對Array[4]進行一些操作?

我敢肯定這是個壞主意,稍后會打到你的腳上,但也許可以嘗試一下

#define VALUES 1, 2, 3, 4

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

您可以嘗試一下...以了解如何操作。

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

這應該是在C中多次重復數組的好方法,因為您的解釋不是一個好方法。 模運算返回[0,REPEAT)中的整數,因此+1表示[1,REPEAT]中的整數。 這是代碼:

#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

最簡單的方法可能是使用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

我想到了!

因此,如果我有一個數組: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的分配中數到四

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM