2015-01-23 2 views
-2

У меня есть некоторые проблемы. Я создал массив структур. и я хочу добавить возраст и имя в список (массив), но если я добавлю значения. оба списка [0], а список [1] ​​- те же значения, что и имена, не включены. пожалуйста, помогите мне ... мой код неправильный?Я хочу добавить некоторые значения в struct

благодаря

#import <Foundation/Foundation.h> 

typedef struct User { 
    char* userName; 
    int userAge; 

}User; 
int count; 

void list(); 
void addUserInToList(User* db, int age, char* name); 

main() { 
    count = 0; 
    int age ; 
    char name[5] ; 
    User list [] = { 
    }; 

    for (int i = 0; i<2; i++) { 
     NSLog(@"Name Please : "); 
     scanf("%s",name); 
     NSLog(@"Age Please :"); 
     scanf("%d",&age); 
     addUserInToList(&list[count], age, name); 
     count++; 
    } 
    NSLog(@"Check :%d :%s",list[0].userAge,list[0].userName); 
    NSLog(@"Check :%d :%s",list[1].userAge,list[0].userName); 
} 

void addUserInToList(User* db, int age, char* name) { 
    db->userAge = age; 
    db->userName = name; 
} 

ответ

1

Изменение функции addUserInToList() ниже

void addUserInToList(User* db, int age, char* name) { 
    db->userAge = age; 
    db->userName = malloc(strlen(name) + 1); 
    strcpy(db->username, name); 
} 

То, что вы пытались сделать только Направьте децибел username для всех пользователей в одном месте памяти, указываемой char name[5] ; Следовательно, все имя пользователя было таким же.

Теперь вы выделяете память каждому имени пользователя и копируете, когда новый пользователь должен быть добавлен в db.

+0

Мне нужно использовать функцию strcpy? и malloc? есть ли способ решить эту проблему без использования malloc и strcpy? –

+0

@yongjoonoh: Варианты, предоставленные Сантошем и Майком, в основном являются единственными опциями, которые у вас есть. –

+0

@yongjoonoh: Чтобы избежать использования malloc, используйте массив, предложенный Майком в нижнем ответе. Чтобы избежать использования strcpy, выполните свою собственную функцию копирования строк или используйте memcpy. –

1

Это связано с тем, что член вашей структуры является только указателем. То есть адрес другой переменной где-то в памяти.

Когда вы читаете ввод пользователя в переменную name в рутине main, вы переписываете все, что использовалось в этом массиве. Вызов addUserInToList изменяет указатель userName в выбранной структуре как адрес переменной name. Поскольку существует только одна переменная name, которая используется повторно для каждого входа, каждый элемент в переменной list будет содержать то же значение для указателя userName, и поэтому они будут указывать на то же имя, которое будет последним.

Вы должны изменить член структуры в userName на массив и скопировать содержимое в функцию addUserInToList.

#define USER_NAME_SIZE 5 
typedef struct User { 
    char userName[USER_NAME_SIZE]; 
    int userAge; 
}User; 

void addUserInToList(User* db, int age, char* name) { 
    db->userAge = age; 
    //Copy the name into the struct, but leave space for one NUL at teh end. 
    strncpy(db->userName, name, (sizeof db-userName) - 1); 
} 

Более «продвинутый» метод должен были бы использовать mallocfree), чтобы создать новый массив для хранения имени. Вы можете рассматривать это как упражнение.

+0

Я не понял. Мне нужно использовать strncpy (db-> имя_пользователя, имя, (sizeof db-userName) - 1); этот код? –

+0

В настоящее время нет guerentee, что 'db-> userName' имеет нулевой конец. 'db-> userName [USER_NAME_SIZE - 1]' в настоящее время имеет неизвестное значение вместо нужного '' \ 0''. –

+0

'strncpy (dst, src, num)' будет копировать до 'num' байт от' src' до 'dst'. Если 'src' меньше байтов' num' (содержит '\ 0'), то он останавливается, когда он был скопирован, в противном случае он останавливается, когда' num' байт копируются и помещают '\ 0' в' dst [Num-1] '. –

Смежные вопросы