C语言简易登录系统开发求助:登录验证逻辑异常排查
嘿,我来帮你搞定这个登录程序的bug!你的问题很典型,咱们一步步拆解:
解决C语言登录系统的密码判定异常问题
核心问题定位
你代码里的关键错误出在这一行:
scanf ("%s", &trypassword);
问题原因解释
trypassword是一个字符数组,在C语言中,数组名本身就等价于指向数组第一个元素的指针(类型为char*),完全符合scanf的%s格式符要求。但你加了&之后,&trypassword变成了指向整个数组的指针(类型为char (*)[50]),类型不匹配会导致scanf把输入的密码写到错误的内存地址上,破坏了后续strcmp比较需要的正确数据——这就是为什么先输错一次后,再输正确密码也会被判定错误的根源。
修正后的完整代码
我帮你修正了这个问题,还加了输入安全的优化,同时补上了必要的头文件(原代码缺这些,编译会报错):
#include <stdio.h> #include <string.h> #include <stdlib.h> void login() { int i; char password[12] = "mohammed3336"; char trypassword[50]; for (i = 0; i < 3; i++) { // 用%49s限制输入长度,避免缓冲区溢出 scanf("%49s", trypassword); if (strcmp(trypassword, password) == 0) { printf("login is successful!\n"); break; } else { if (i == 2) { printf("Too many failed attempts, exiting program.\n"); exit(0); } printf("password is wrong, try again (trial %d of 3)\n", i+1); } } }
额外的小提示
- 永远要限制输入长度:使用
%49s而不是裸的%s,可以防止用户输入超过数组容量的内容,避免缓冲区溢出的安全问题。 - 头文件不能少:
<stdio.h>负责输入输出,<string.h>提供strcmp函数,<stdlib.h>提供exit函数,缺了这些编译器会报“未定义标识符”的错误。
内容的提问来源于stack exchange,提问作者Mohammed Elbagoury
相关产品推荐
相关产品推荐

