p *newPerson = (p *)malloc(sizeof(person));
//here how can I assign the name to this new person?
Вы должны сделать это:
strcpy(p->name,name);
Вы также должны изменить использование p
на struct person
, поскольку p
не тип, это глобальный типstruct person
.Измените код на:
struct person *addNewPerson(char *name)
{
struct person *newPerson = malloc(sizeof *newPerson);
// Я должен что-то сделать с этим «вводом», например, input [strlen (input) -1] =
НетScanf не завершит строку за вас.
Имейте в виду, однако, что обработку строки в C должна выполняться очень и очень осторожно.например, когда вы делаете scanf("%s", input);
, что произойдет, если вы введете имя длиной более 24 символов?
Может произойти все что угодно.scanf может переполнить ваш буфер, и вы получите неопределенное поведение.Вы должны сделать по крайней мере это:
int ret = scanf("%24s",buffer); //read max 24 chars, to make space for a final '\0'
if(ret == EOF) { //end of input reached.
break;
if(ret != 1) {
// for whatever reason, the conversion failed. exit, or alert the user, or whatever
}
Аналогично, внутри вашего addNewPerson
в strcpy(p->name,name);
, strcpy может с радостью записать за буфер, если name
длиннее, чем может удержать p->name
.В этом конкретном случае с вышеупомянутой модификацией для scanf длина всегда будет 24 или меньше, так что это безопасно.Но имейте это в виду в общем.
Вызов addNewPerson должен просто передать имя buffer
напрямую, при использовании в качестве значения имя массива затухает до указателя на первый элементэтот массив;
struct person *newPerson = addNewPerson(input);
Поскольку newPerson
динамически выделяется с помощью malloc (), не забывайте free (), когда он вам больше не нужен.В противном случае у вас будет утечка памяти.