如何在C语言登录功能中验证用户名是否在数组内并校验密码?
登录流程实现修正与优化
你要实现的是「校验用户名是否在指定数组、密码正确后授予访问权限」的登录流程,原代码存在几个关键问题,下面是修正后的完整实现:
原代码的问题点
name定义成了单个字符类型,根本存不下用户名,得改成字符数组- 用户数组
user的定义方式错误,没法正确存储多个用户名,应该用字符指针数组 - 判断条件里用了没定义的变量
i,而且没遍历用户数组去匹配输入的用户名 scanf读取用户名时传了&name,如果是字符数组直接传数组名就行- 登录成功后没退出循环,也没明确的成功提示;失败后只有清屏等待,用户不知道为啥失败
sleep函数需要对应头文件支持,不同系统要加不同头文件
修正后的代码
// 头文件 #include <stdio.h> #include <stdlib.h> #include <string.h> // Windows 系统用这个头文件,Linux 换成 <unistd.h> #include <windows.h> // 宏定义 #define maxchar 9 #define MAX_ATTEMPTS 3 #define USER_COUNT 5 // 登录函数 void userLogin() { // 统一密码(如果要每个用户不同密码,得改成对应数组) static const char pass[] = "12345678"; // 存储输入的用户名和密码 char passentry[maxchar], name[20]; // 正确的用户数组定义 char *user[] = {"user1", "user2", "user3", "user4", "user5"}; // 标记是否登录成功 int login_success = 0; for(int attempt = 0; attempt < MAX_ATTEMPTS; attempt++) { printf("\n\t\t\t\t\t 输入用户名:"); // 直接传数组名,限制读取长度避免溢出 scanf("%19s", name); fflush(stdout); printf("\n\t\t\t\t\t 输入密码:"); scanf("%8s", passentry); fflush(stdout); // 遍历用户数组,检查用户名是否存在 for(int i = 0; i < USER_COUNT; i++) { if (strcmp(user[i], name) == 0 && strcmp(passentry, pass) == 0) { printf("\n\t\t\t\t\t 登录成功!欢迎你,%s!\n", name); login_success = 1; // 成功后直接跳出所有循环 goto login_end; } } // 走到这里说明用户名或密码错误 printf("\n\t\t\t\t\t 用户名或密码错误!剩余尝试次数:%d\n", MAX_ATTEMPTS - attempt - 1); sleep(2); system("CLS"); } login_end: if(!login_success) { printf("\n\t\t\t\t\t 尝试次数过多,登录失败!\n"); } }
关键修改说明
- 把
name改成char name[20],能存储正常长度的用户名,同时scanf限制读取长度防止缓冲区溢出 - 用户数组改成
char *user[],正确存储多个字符串 - 增加内层循环遍历用户数组,匹配输入的用户名
- 登录成功后用
goto直接跳出所有循环(也可以用标志位+break),并给出明确的成功提示 - 失败时提示错误信息和剩余尝试次数,用户体验更好
- 增加
login_success标志位,处理尝试次数过多的情况 - 明确标注了不同系统下
sleep需要的头文件
内容的提问来源于stack exchange,提问作者bedeebodoo
相关产品推荐
相关产品推荐

