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

C语言基础注册系统登录功能无输出逻辑错误排查求助

C语言注册登录系统错误排查

核心错误及修复方案

  • 登录时用户名读取错误
    你当前使用scanf(" %c",&l_name);读取用户名,%c格式符仅能读取单个字符,无法读取完整的用户名字符串。应修改为字符串读取格式:
    scanf("%6s", l_name);
    
    其中%6s限制最多读取6个字符,避免7位长度的l_name数组出现缓冲区溢出。
  • 输入缓冲区残留换行符导致读取异常
    执行scanf("%d",&choice);读取登录选项时,用户输入数字后敲击的回车符会残留在输入缓冲区中,后续调用gets()会直接读取到空的换行内容,导致密码/用户名读取失败。可在读取choice后加一行代码清空缓冲区:
    while(getchar() != '\n');
    
  • 缺少登录结果判断逻辑
    密码逐位比对完成后,你没有对count2的值做判断输出,即使用户输入的密码完全正确也不会有登录成功的提示。可补充逻辑:
    if(count2 == 6) {
        printf("\n登录成功!");
    } else {
        printf("\n密码错误!");
    }
    
  • 不安全的gets()函数使用
    gets()函数不检查输入长度,极易触发缓冲区溢出,已被C11标准移除,建议替换为fgets(),例如读取用户名可以写为:
    fgets(user_nam, 7, stdin);
    // 移除fgets读取到的末尾换行符
    user_nam[strcspn(user_nam, "\n")] = '\0';
    
  • 注册失败后仍允许登录的逻辑漏洞
    当前代码只要用户名长度符合要求,就算密码校验不通过t!=0,依然会进入后续的登录流程,不符合业务逻辑,可在密码校验失败的分支增加return 0;直接结束程序,或者引导用户重新注册。
  • 字符串比对逻辑不完善
    你当前仅逐位比对固定长度的字符,若用户输入的登录用户名长度不足5位,数组剩余位置的随机值会导致比对结果错误,建议直接使用标准库函数strcmp做字符串比对,例如用户名比对可简化为:
    if(strcmp(l_name, user_nam) == 0) {
        // 用户名正确
    }
    

内容的提问来源于stack exchange,提问作者haseeb panhwer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:06:04