You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:06:04