我想知道如何在C中重复一次数组。
假设我有一个像int Array[4] = [1, 2, 3, 4]
是否有一种获取数组的简单方法:int Array2[8] = [1, 2, 3, 4, 1, 2, 3, 4]
在Array[4]
上执行某些操作?
答案 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
的分配中计算过去四