Прототип вашей функции должен прояснить, что она работает с массивом:
void add(size_t n, struct Person arr[n], int *tam);
Таким образом, вы знаете размер массива (n
), и вы можете убедиться, что выне пытайтесь получить доступ за пределами этого размера, который в итоге окажется segmentation fault
, если вам повезет (прочитайте это: Насколько опасно обращаться к массиву за пределами границ? ).
Цикл for
будет затем зацикливаться на массиве:
for (int i = 0, *tam = 0; i < n; i++, (*tam)++) {
printf("Insert your name:\n");
fgets(name, 30, stdin);
/* a[i].name = name; */
}
(*tam)++;
Вам нужно круглые скобки вокруг (*tam)++
из-за предшествующего оператора (прочитайте это: Как увеличить адрес указателя и значение указателя? ).
Что касается доступа к struct
s внутри массива, вы должны знать, что вы обращаетесь к массивуstruct
с;это просто много struct
с, вместе взятых, так как массив int
с будет:
a
- это массив struct
с.
a[i]
i
th-структура в массиве.
a[i].name
- это элемент name
в структуре a[i]
.
Чтобы скопировать строку в другую, у вас естькопировать его элемент за элементом, потому что внутренне они являются массивом char
s, и из-за того, как массивы работают в C, вы не можете копировать их с помощью =
, но повторяя и копируя элемент по элементу.
В случае обычных массивов, функция memcpy()
делает это за вас (прочитайте это: http://man7.org/linux/man-pages/man3/memcpy.3.html).
Когда вы имеете дело со строками, функция, которую вы хотите использовать для их копирования, является strncpy()
(прочитайте это: http://man7.org/linux/man-pages/man3/strncpy.3p.html).
В этом ответе объясняется правильное использование strncpy()
: https://stackoverflow.com/a/14067026/6872717
В основном вы будете использовать его так:
strncpy(a[i].name, name, n - 1);
так что ваш for
цикл должен выглядеть следующим образом:
for (int i = 0, *tam = 0; i < n; i++, (*tam)++) {
printf("Insert your name:\n");
fgets(name, 30, stdin);
strncpy(a[i].name, name, 40 - 1);
a[i].name[40 - 1] = '\0';
}
(*tam)++;
Это больше комментарий, и я могу удалить его позже, если это не то, что вы хотите, ноЗдесь я могу лучше отформатировать код:
Я не уверен, почему существует цикл for
, но для контекста, я думаю, эта функция предназначена только для записи в один struct
в массиве,Поэтому, возможно, вместо цикла for
вы можете захотеть что-то вроде этого:
if (*tam = (n - 1))
goto err_array_full;
if (*tam > (n - 1) || *tam < 0)
goto err_invalid_index;
printf("Insert your name:\n");
fgets(name, 30, stdin);
strncpy(a[*tam].name, name, 40 - 1);
a[*tam].name[40 - 1] = '\0';
(*tam)++;
Последнее замечание: я использовал 40
в strncpy()
, потому что вы использовали 40
для создания массива, но должен быть макросом, который вы бы использовали в обоих местах, чтобы при изменении размера массива вы не забыли изменить его также в strncpy()
, что привело бы к ошибке.С макросом вы в безопасности, потому что вы меняете только один номер, и весь ваш код обновляется.