C语言账号管理程序无法正确读取文件内容问题求助
代码错误点汇总
1. 结构体定义错误
手机号字段pnumber定义为int pnumber[20],但实际你是按字符串格式输入手机号,类型完全不匹配,导致写入文件的内容全是乱码。需要修改为char pnumber[20]。
2. info函数未读取文件内容
你在info函数里只打开了文件,完全没有调用fread读取文件内容到u1结构体,直接打印未初始化的局部变量,输出自然是乱码或者空值。需要在打开文件成功后添加读取逻辑:
if (fp == NULL) { printf("error in opening file"); // 这里要加返回逻辑,不然继续往下执行还是读垃圾值 return; } // 读取匹配当前登录用户的信息即可,示例读取第一条记录 fread(&u1, sizeof(u1), 1, fp);
3. main函数的switch语句缺少break
选1执行登录后,会自动穿透到case2执行注册逻辑,完全不符合预期,修改为:
switch(i) { case 1: signin(); break; // 补充break case 2: signup(); break; // 补充break }
4. 注册逻辑的密码录入完全错误
- 你先写了
scanf("&d", &u1.password),格式符写错(应该是%s,且字符串输入不需要加&),这里已经写坏了password字段的内存 - 后面用
getch录入的密码存在局部变量password数组里,根本没有赋值给u1.password,导致写入结构体的密码是垃圾值 - 录入的密码没有手动加字符串结束符
\0,后续字符串比较会越界
修复示例:
printf("\nPASSWORD.."); // 删掉错误的scanf行 for (i = 0; i < sizeof(u1.password)-1; i++) // 预留一位存结束符 { ch = getch(); if (ch != 13) { u1.password[i] = ch; // 直接写入结构体的password字段 ch = '*'; printf("%c", ch); } else break; } u1.password[i] = '\0'; // 补充字符串结束符
5. 输入格式错误
所有字符串输入的scanf参数都多加了&,数组名本身就是首地址,不需要取地址符,比如scanf("%s", &u1.fname)要改成scanf("%s", u1.fname),避免触发内存越界。
6. 手机号打印格式错误
info函数里打印手机号用了%d,如果pnumber改成char数组,要换成%s格式符:
printf("MOBILE NUMBER..%s", u1.pnumber);
7. 登录校验逻辑错误
- 只比对了用户名,完全没校验密码
- 只要第一条记录不匹配就直接提示错误,不会遍历后续的用户记录
- 校验成功后没有保存当前登录的用户信息,导致后续
info函数不知道要读取哪个用户的记录
修复逻辑:遍历所有记录,同时比对用户名和密码,匹配成功后再跳转到主菜单,同时保存当前登录的用户名到全局变量,方便info函数读取对应记录。
8. 字符串长度越界风险
所有字符数组的输入都没有做长度限制,比如username定义为char[10],输入超过9个字符就会越界写内存,建议给scanf加长度限制:scanf("%9s", u1.username)。
内容的提问来源于stack exchange,提问作者root1_2
相关产品推荐
相关产品推荐

