[英]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.