C语言密码输入的基础

        在编程中,用户登录验证是一个常见的功能。以下是一个简单的用户登录验证程序,它使用了 scanf 函数获取用户输入的密码,并通过 strcmp 函数比较用户输入的密码和预设密码是否匹配。我们将对这个程序进行一些优化,并详细解释这些优化措施。

首先,让我们回顾一下原始的程序代码:

#include<stdio.h>
#include<string.h>

int main() {
    int i = 0;
    char password[20] = { 0 };
    
    for (i = 0; i < 3; i++) {
        printf("请输入密码(3次机会);\n");
        scanf("%s", password);
        
        if (strcmp(password, "123456") == 0) { // 检查密码是否匹配
            printf("登陆成功!!!\n");
            break;
        }
        else {
            printf("用户或密码错误\n");
        }
    }
    
    if (i > 3) {
        printf("输入次数已用完!请退出程序!\n");
    }
    
    return 0;
}

虽然这个程序能够完成基本的登录验证功能,但我们可以对其进行以下优化:

  • 防止缓冲区溢出:scanf 函数在读取字符串时可能会导致缓冲区溢出。为了防止这种情况,我们可以限制 scanf 读取的字符数量,如下所示:
scanf("%19s", password); // 限制最多读取19个字符(留一个字节给 '\0')
  • 添加密码输入掩码:为了提高用户输入密码时的安全性,我们可以使用 getch 函数逐个读取字符,并显示星号(*)作为掩码,如下所示:
#include <conio.h> // 引入头文件以使用 getch 函数

// ...

for (i = 0; i < 3; i++) {
    printf("请输入密码(3次机会);\n");
    
    for (int j = 0; j < sizeof(password) - 1; j++) { // 使用循环读取每个字符
        char ch = getch(); // 获取一个字符
        if (ch == '\r' || ch == '\n') { // 如果是回车,则结束输入
            password[j] = '\0'; // 结束字符串
            break;
        }
        else if (ch == '\b') { // 如果是退格键,则删除前一个字符
            if (j > 0) {
                printf("\b \b"); // 删除星号并回退光标
                j--;
            }
        }
        else {
            password[j] = ch; // 将字符添加到密码中
            printf("*"); // 显示星号作为掩码
        }
    }
    
    // ...
}
  • 提供更明确的错误提示:在用户输入错误时,我们可以通过修改错误提示信息来提供更明确的反馈:
if (strcmp(password, "123456") != 0) { // 检查密码是否不匹配
    printf("密码错误,请重新输入\n");
}

程序代码如下:

#include<stdio.h>
#include<string.h>
#include <conio.h> // 引入头文件以使用 getch 函数

int main() {
    int i = 0;
    char password[20] = { 0 };
    
    for (i = 0; i < 3; i++) {
        printf("请输入密码(3次机会);\n");
        
        for (int j = 0; j < sizeof(password) - 1; j++) {
            char ch = getch();
            if (ch == '\r' || ch == '\n') {
                password[j] = '\0';
                break;
            }
            else if (ch == '\b') {
                if (j > 0) {
                    printf("\b \b");
                    j--;
                }
            }
            else {
                password[j] = ch;
                printf("*");
            }
        }
        
        if (strcmp(password, "123456") != 0) {
            printf("密码错误,请重新输入\n");
        }
        else {
            printf("登陆成功!!!\n");
            break;
        }
    }
    
    if (i > 3) {
        printf("输入次数已用完!请退出程序!\n");
    }
    
    return 0;
}

总结,通过对原始的用户登录验证程序进行上述优化,我们可以提高其安全性、用户体验和错误提示的明确性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普通young man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值