【发布时间】:2016-05-31 04:19:40
【问题描述】:
我有 userStack 类型的链接列表 user
struct user {
int id; // ID
char login[20]; // login
char password[32]; // password md5
user *next;
};
这是添加节点的功能:
void addUser(user **userStack) {
if (*userStack == NULL)
{
user *p = new user;
*p = enterUser();
p->next = NULL;
*userStack = p;
}
else
{
user *p = new user;
*p = enterUser(); / returns struct user (keyboard input)
p->next = *userStack;
*userStack = p;
}
printf("User is added successfully!\n");
}
user enterUser() {
user *u = new user;
int tmpID = -1;
char tmpLogin[20];
char tmpPass[20];
char tmpPass2[20];
std::string hashPass;
system("cls");
fflush(stdin);
printf("Введите id пользователя: ");
scanf("%d", &tmpID);
while (isUserExists(tmpID) || tmpID < 0){
fflush (stdin);
if (isUserExists(tmpID))
printf ("!!! Пользователь с таким id уже существует. \n");
if (tmpID < 0)
printf ("!!! ID пользователя не может быть отрицательным! \n");
printf("Введите id пользователя: ");
scanf ("%d", &tmpID);
}
u -> id = tmpID;
fflush(stdin);
printf("Введите имя пользователя: ");
gets(tmpLogin);
fflush(stdin);
while (isUserExistsLogin(tmpLogin)){
printf ("!!! Пользователь с таким именем уже существует. \n");
printf("Введите имя пользователя: ");
gets(tmpLogin);
fflush(stdin);
}
strcpy(u -> login, tmpLogin);
printf("Введите пароль пользователя: ");
scanf ("%s", &tmpPass);
printf ("Введите пароль повторно: ");
scanf ("%s", &tmpPass2);
while (strcmp(tmpPass, tmpPass2) != 0){
if (strcmp(tmpPass, tmpPass2) != 0)
printf ("!!! Пароли не совпадают!\n");
printf("Введите пароль пользователя: ");
scanf ("%s", &tmpPass);
fflush (stdin);
printf ("Введите пароль повторно: ");
scanf ("%s", &tmpPass2);
}
hashPass = md5(tmpPass);
strcpy(u->password, hashPass.c_str());
printf("\n");
return *u;
}
当我添加第一个节点时,一切正常。
但是当我添加 2nd 和其他时,我在 p->next = *userStack; 行中遇到了麻烦。
此行正确更改了指针,但在password 的末尾添加了垃圾。
那是我的麻烦。 谢谢。
【问题讨论】:
-
“
user *p = new user;”。您是要标记此c还是c++? -
请出示
enterUser()的代码 -
user *p = new user;后跟*p = enterUser();强烈建议您覆盖第一个*p值。 -
您的
enterUser()存在内存泄漏。您分配内存,并且永远不要将new返回的指针值保存在任何地方,以便以后可以释放它。你真的应该返回user而不是user *?
标签: c pointers linked-list