Эта строка:
*(data+i)->name == scanf("%s", (char*)&data[i].name);
Игнорируя странное и пустое ==
на мгновение, &data[i].name
неверно, так как вы берете адрес указателя.data[i].name
здесь будет достаточно, поскольку поле name
уже является адресом, в который может записываться scanf
.
А приведение к (char*)
- это то, что, вероятно, закрывает компилятор об этом - вы ввели его для этого :-)?Поскольку &data[i].name
имеет тип char**
, который scanf
не примет, если только вы принудительно не приведете его к char*
.
В качестве общего совета старайтесь избегать scanf
- это приводитв очень небезопасный код (как вы только что видели!) Вместо этого используйте fgets
, чтобы прочитать строку (также из стандартного ввода), а затем разбить эту строку на составляющие.Это может первоначально потребовать немного больше кода для реализации, но приводит к гораздо более безопасному и более предсказуемому коду.