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

如何在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");
    }
}

关键修改说明

  1. 把 name 改成 char name[20],能存储正常长度的用户名,同时 scanf 限制读取长度防止缓冲区溢出
  2. 用户数组改成 char *user[],正确存储多个字符串
  3. 增加内层循环遍历用户数组,匹配输入的用户名
  4. 登录成功后用 goto 直接跳出所有循环(也可以用标志位+break),并给出明确的成功提示
  5. 失败时提示错误信息和剩余尝试次数,用户体验更好
  6. 增加 login_success 标志位,处理尝试次数过多的情况
  7. 明确标注了不同系统下 sleep 需要的头文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:31:06