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"); } }为什么错了
时间: 2024-04-28 08:26:36 浏览: 113
在 `chongzhi()` 函数中,`head2` 指针没有被初始化,而是直接调用了 `duqu2()` 函数返回的空指针。因此,在 `head2` 指针未初始化的情况下,对其进行操作会导致程序崩溃或者出现意料之外的结果。
你需要在 `chongzhi()` 函数的开头,使用 `duqu2()` 函数初始化 `head2` 指针,即将 `struct xinxi *head2=NULL;` 修改为 `struct xinxi *head2=duqu2();`,这样才能对 `head2` 指针进行操作。
相关问题
struct xinxi *duqu2() { struct xinxi *head2= NULL; struct xinxi *temp = NULL; char dianhua[20], mima[20],chepaihao[20]; FILE *fp = fopen("用户信息.txt", "ab+"); 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; } }优化
可以对这段代码进行如下优化:
1. 增加错误处理逻辑,当文件打开失败或读取数据失败时,应该及时关闭文件并释放内存。
2. 使用fgets函数读取文件内容,避免使用%s格式符造成的数据读取不正确的问题。
3. 在读取文件内容时,对读取到的数据进行有效性检查,避免出现异常情况。
4. 在动态分配内存时,对内存分配结果进行有效性检查,避免分配失败导致的程序异常。
5. 在链表的构建过程中,增加错误处理逻辑,避免链表出现异常。
优化后的代码如下:
```
struct xinxi *duqu2() {
struct xinxi *head2 = NULL;
struct xinxi *temp = NULL;
char line[64];
char dianhua[20], mima[20], chepaihao[20];
FILE *fp = fopen("用户信息.txt", "r");
if (fp == NULL) {
printf("打开文件失败!文件名: 用户信息.txt\n");
return NULL;
}
while (fgets(line, sizeof(line), fp) != NULL) {
if (sscanf(line, "%s %s %s", dianhua, mima, chepaihao) != 3) {
printf("读取文件内容失败!\n");
fclose(fp);
return NULL;
}
struct xinxi *p = (struct xinxi *)malloc(sizeof(struct xinxi));
if (p == NULL) {
printf("分配内存失败!\n");
fclose(fp);
return NULL;
}
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;
}
```
#include <stdio.h> #include <malloc.h> #include <string.h> #define N 20 struct xinxi *head1; struct xinxi *addxinxi(); void xianshi(struct xinxi *head1); int main() { head1=addxinxi(); xianshi(head1); return 0; } struct xinxi { char zhanghao[N]; char mima[N]; struct xinxi *next; }; struct xinxi *addxinxi() { char str[N]="0"; struct xinxi *p,*pr,*q; struct xinxi *head1; pr=p=(struct xinxi *)malloc(sizeof(struct xinxi)); printf("\t\t\t\t请输入以下信息(用户名或密码为0时退出):\n"); printf("\t\t\t\t用户名:"); scanf("%s",p->zhanghao); printf("\t\t\t\t密码:"); scanf("%s",p->mima); printf("\n"); head1=NULL; while(strcmp(p->zhanghao,str)!=0&&strcmp(p->mima,str)!=0) { if(head1==NULL) { head1=p; } else { p=p->next; pr=p; } p=(struct xinxi *)malloc(sizeof(struct xinxi)); printf("\t\t\t\t用户名:"); scanf("%s",p->zhanghao); printf("\t\t\t\t密码:"); scanf("%s",p->mima); printf("\n"); } pr->next=NULL; q=head1; FILE *fp; fp=fopen("账号密码.txt","w+"); if(q=NULL) { printf("\t\t\t\t无内容!\n"); } else { while(q!=NULL) { fprintf(fp,"%s %s",p->zhanghao,p->mima); q=q->next; } } fclose(fp); return head1; } void xianshi(struct xinxi *head1) { struct xinxi *p; p=head1; if(head1==NULL) { printf("无内容!"); } else { while(p!=NULL) { printf("\t\t\t\t用户名:%s 密码:%s\n",p->zhanghao,p->mima); p=p->next; } } return; }为什么错误
这段代码有一些问题:
1. 在函数`addxinxi()`中,判断条件应该是`strcmp(p->zhanghao,str)!=0 || strcmp(p->mima,str)!=0`,因为只有用户名和密码都为0时才退出循环。
2. 在函数`addxinxi()`中,`if(q=NULL)`应该是`if(q==NULL)`,因为`=`是赋值操作符,而`==`才是判断相等的操作符。
3. 在函数`addxinxi()`中,`fprintf(fp,"%s %s",p->zhanghao,p->mima)`应该是`fprintf(fp,"%s %s",q->zhanghao,q->mima)`,因为你要写入的是链表中节点的信息。
4. 在函数`addxinxi()`中,应该在每次添加新节点时,将其链接到链表的末尾,即`pr->next=p`。
5. 在函数`addxinxi()`中,应该在循环结束后,释放最后一个节点的内存,即`free(p)`。
6. 在函数`addxinxi()`中,应该在循环结束后,返回链表的头指针,即`return head1`。
7. 在函数`addxinxi()`中,应该在循环结束后,先关闭文件指针,再返回。
8. 在函数`addxinxi()`中,应该检查文件指针是否打开成功,即`if(fp==NULL)`,如果打开失败,应该返回空指针。
9. 在函数`xianshi()`中,可将`return;`改为`return;`,因为该函数没有返回值。
10. 在函数`xianshi()`中,应该将`if(head1==NULL)`改为`if(p==NULL)`,因为你要打印的是链表中的节点信息。
11. 在函数`xianshi()`中,应该将`printf("%s %s\n",p->zhanghao,p->mima);`改为`printf("\t\t\t\t用户名:%s 密码:%s\n",p->zhanghao,p->mima);`,因为你要按照一定的格式输出信息。
综上所述,修改后的代码如下:
阅读全文