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
相关产品推荐
相关产品推荐

