void chongzhi() { char dianhua[N]; char mima[N]; char xinmima[N]; struct xinxi *head2,*p,*pr,*q; p=head2=duqu2(); printf("请输入账号(联系方式):"); scanf("%s",dianhua); printf("请输入原密码:"); scanf("%s",mima); while(p!=NULL) { if(strcmp(dianhua,p->dianhua)==0&&strcmp(mima,p->mima)==0) { printf("请输入新密码:"); scanf("%s",xinmima); strcpy(p->mima,xinmima); break; } p=p->next; } if(p==NULL) { printf("账号(联系方式)或密码错误!\n"); } FILE *fp; fp=fopen("用户信息.txt","w"); q=head2; while(q!=NULL) { fprintf(fp,"%s %s %s\n", q->dianhua, q->mima,q->chepaihao); q=q->next; } }
时间: 2024-04-28 21:26:57 浏览: 16
这段代码是一个简单的账号密码重置的功能,主要包括以下几个步骤:
1. 读取已有的用户信息,存储在链表中。
2. 用户输入账号和原密码,程序遍历链表查找是否存在该用户,并且密码也匹配。
3. 如果存在该用户,则用户输入新密码,程序将新密码更新到链表中对应的用户信息中。
4. 如果不存在该用户或者密码不匹配,则输出错误提示。
5. 最后将更新后的用户信息重新写入文件中。
需要注意的是,该代码只是一个简单的示例,没有进行密码加密等安全措施,实际应用中需要加强安全性。
相关问题
void chongzhi() { char dianhua[N]; char mima[N]; char xinmima[N]; struct xinxi *head2,*p,*pr,*q; p=head2=duqu2(); printf("请输入账号(联系方式):"); scanf("%s",dianhua); printf("请输入原密码:"); scanf("%s",mima); while(p!=NULL) { if(strcmp(dianhua,p->dianhua)==0&&strcmp(mima,p->mima)==0) { printf("请输入新密码:"); scanf("%s",xinmima); strcpy(p->mima,xinmima); break; } p=p->next; } if(p==NULL) { printf("账号(联系方式)或密码错误!\n"); } FILE *fp; fp=fopen("用户信息.txt","w"); q=head2; while(q!=NULL) { fprintf(fp,"%s %s %s\n", q->dianhua, q->mima,q->chepaihao); q=q->next; } }优化
为了优化这段代码,可以考虑以下几点:
1. 在函数开始处定义链表头结点,避免定义多个指针和使用全局变量。
2. 将文件读写操作放在函数外部进行,避免多次打开和关闭文件。
3. 对用户输入的密码进行加密处理,增强安全性。
修改后的代码如下:
```c
void chongzhi() {
char dianhua[N];
char mima[N];
char xinmima[N];
struct xinxi *head2 = NULL, *p, *q;
head2 = duqu2("用户信息.txt"); // 读取用户信息
printf("请输入账号(联系方式):");
scanf("%s", dianhua);
printf("请输入原密码:");
scanf("%s", mima);
p = head2;
while (p != NULL) {
if (strcmp(dianhua, p->dianhua) == 0 && strcmp(mima, p->mima) == 0) {
printf("请输入新密码:");
scanf("%s", xinmima);
// 对新密码进行加密处理
encrypt(xinmima);
strcpy(p->mima, xinmima);
break;
}
p = p->next;
}
if (p == NULL) {
printf("账号(联系方式)或密码错误!\n");
} else {
FILE *fp;
fp = fopen("用户信息.txt", "w");
q = head2;
while (q != NULL) {
fprintf(fp, "%s %s %s\n", q->dianhua, q->mima, q->chepaihao);
q = q->next;
}
fclose(fp);
}
// 释放链表空间
free_xinxi(head2);
}
```
这样修改后的代码更加简洁、安全,且可读性更强。同时,为了增强安全性,我们可以对用户密码进行加密处理,可以使用 MD5 等加密算法。
struct xinxi *duqu2() { struct xinxi *head2= NULL; struct xinxi *temp = NULL; char dianhua[20], mima[20],chepaihao[20]; FILE *fp = fopen("用户信息.txt", "r"); if (fp == NULL) { printf("\t\t\t\t打开文件失败!文件名: 用户信息.txt\n"); return NULL; } else { while (fscanf(fp, "%s %s %s", dianhua, mima,chepaihao) != EOF) { struct xinxi *p = (struct xinxi *)malloc(sizeof(struct xinxi)); if (p == NULL) { printf("分配内存失败!\n"); } strcpy(p->dianhua, dianhua); strcpy(p->mima, mima); strcpy(p->chepaihao,chepaihao); if (head2 == NULL) { head2 = temp = p; } else { temp->next = p; temp = p; } } fclose(fp); if (temp != NULL) { temp->next = NULL; } return head2; } } void chongzhi() { char dianhua[N]; char mima[N]; char xinmima[N]; struct xinxi *head2,*p,*q; p=head2=duqu2(); printf("请输入账号(联系方式):"); scanf("%s",dianhua); printf("请输入原密码:"); scanf("%s",mima); while(p!=NULL) { if(strcmp(dianhua,p->dianhua)==0&&strcmp(mima,p->mima)==0) { printf("请输入新密码:"); scanf("%s",xinmima); strcpy(p->mima,xinmima); break; } p=p->next; } if(p==NULL) { printf("\t\t\t\t账号(联系方式)或密码错误!\n"); } else { FILE *fp; fp=fopen("\t\t\t\t用户信息.txt","w"); q=head2; while(q!=NULL) { fprintf(fp,"%s %s %s\n", q->dianhua, q->mima,q->chepaihao); q=q->next; } fclose(fp); printf("\t\t\t\t重置成功!\n"); } }为什么错了
在 `chongzhi()` 函数中,`head2` 指针没有被初始化,而是直接调用了 `duqu2()` 函数返回的空指针。因此,在 `head2` 指针未初始化的情况下,对其进行操作会导致程序崩溃或者出现意料之外的结果。
你需要在 `chongzhi()` 函数的开头,使用 `duqu2()` 函数初始化 `head2` 指针,即将 `struct xinxi *head2=NULL;` 修改为 `struct xinxi *head2=duqu2();`,这样才能对 `head2` 指针进行操作。