В вашем коде есть ряд ошибок! Чтобы обратиться к «другим» первым:
- Вам необходимо предоставить прототипы функций для
AddCar
и ShowCar
, прежде чем использовать их, или компилятор предположит, что они возвращают int
и затем жаловаться, когда видит фактические определения. - Ваша
main
функция (правильно) возвращает 0
, но она объявлена как void
- поэтому измените ее на int main(...)
.
И «реальная» проблема: вы передаете структуру car
в AddCar
по значению - что означает, что копия сделана, а затем передана к функции. Изменения в этой копии не влияют на переменную в вызывающем модуле (то есть в main
). Чтобы это исправить, вам нужно передать указатель в структуру car
и использовать оператор ->
(вместо оператора .
) в этой функции.
Вот «исправленная» версия вашего кода с добавленными комментариями, где я внес значительные изменения:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct car {
char plate[10];
char model[20];
char color[10];
};
// Add your functions' prototypes before you use them...
void AddCar(struct car *c, char p[10], char m[10], char r[10]);
void ShowCar(struct car c);
int main() // If you return an int, you must declare that you do!
{
struct car c[4];
// Here, we pass a pointer to `c[0]` by adding the `&` (address of)...
AddCar(&c[0], "43ds43", "ford", "blue");
ShowCar(c[0]);
return 0;
}
void AddCar(struct car *c, char p[10], char m[10], char r[10])
{ // ^ To modify a variable, the function needs a POINTER to it!
strcpy(c->plate, p);
strcpy(c->model, m); // For pointers to structures, we can use "->" in place of "."
strcpy(c->color, r);
}
void ShowCar(struct car c)
{
printf("Plate: %s Model: %s Color: %s\n-------", c.plate, c.model, c.color);
}
Не стесняйтесь просить дальнейших разъяснений и / или объяснений.