我想在struct中添加一些值

时间:2015-01-23 16:46:22

标签: c arrays struct

我有一些问题。我做了一个结构数组。我想在列表(数组)中添加年龄和名称,但如果我添加值。列表[0]和列表[1]都相同,甚至不包括名称值。请帮帮我......我的代码是错的吗?

谢谢

#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;
}

2 个答案:

答案 0 :(得分: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] ;指向的单个内存位置,因此所有用户名都相同。

现在,您可以为每个用户名分配内存,并在新用户必须添加到数据库时进行复制。

答案 1 :(得分:1)

这是因为结构的userName成员只是一个指针。即内存中某处的另一个变量的地址。

当您在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); 
}

更高级的&#39;方法是使用malloc(和free)创建一个新数组来保存名称。您可以将此视为练习。