Ответ 1
memcpy(myarray, (int [5]){a,b,c,d,e}, 5*sizeof(int));
В C я знаю, что могу создать такой массив
int myarray[5] = {a,b,c,d,e};
Однако представьте, что массив уже был инициализирован как
int myarray[5];
а затем в какой-то момент после этого я хотел установить/изменить все значения без перехода
myarray[0] = a;
myarray[1] = b;
myarray[2] = c;
myarray[3] = d;
myarray[4] = e;
а скорее нечто большее, чем
myarray = {a,b,c,d,e};
Причина, по которой я спрашиваю об этом, состоит в том, что если я объявлю свой массив в куче, я инициализирую массив следующим образом:
int* myarray = malloc(5*sizeof(int));
Затем я хотел бы иметь возможность вводить все значения в одной строке (в основном, чтобы сделать мой код более чистым)
memcpy(myarray, (int [5]){a,b,c,d,e}, 5*sizeof(int));
Вот решение, совместимое со всеми стандартами (C89, C99, С++)
Преимущество состоит в том, что вы беспокоитесь только о вводе данных в одном месте. Ни один другой код не нуждается в изменении - нет волшебных чисел. Массив объявляется в куче. Таблица данных объявлена как const.
(Нажмите здесь, чтобы попробовать запустить его в Codepad)
#include<stdio.h>
#include<stdlib.h>
int main()
{
unsigned int i = 0;
int *myarray = 0;
static const int MYDATA[] = {11, 22, 33, 44, 55};
myarray = (int*)malloc(sizeof(MYDATA));
memcpy(myarray, MYDATA, sizeof(MYDATA));
for(i = 0; i < sizeof(MYDATA)/sizeof(*MYDATA); ++i)
{
printf("%i\n", myarray[i]);
}
free(myarray);
return 0;
}
Нет, C не имеет такой функции. Если вы устанавливаете все элементы массива на одно значение, используйте memset(3)
.
#include<stdio.h>
#include<stdlib.h>
int *setarray(int *ar,char *str)
{
int offset,n,i=0;
while (sscanf(str, " %d%n", &n, &offset)==1)
{
ar[i]=n;
str+=offset;
i+=1;
}
return ar;
}
int main()
{
int *sz=malloc(5*sizeof(int)),i;
//call
setarray(sz,"10 30");
//output
for(i=0;i<2;i++)
printf("%d\n",sz[i]);
return 0;
}