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

如何使用bool、if语句、while语句校验用户输入有效性?附密码检查器代码

密码检查器修正 + 输入校验核心知识点详解

嘿,我来帮你搞定这个密码检查器的问题,顺便把你关心的bool、if、while在输入校验里的用法讲明白~先看看你的原始代码里的几个小坑,再给你修正后的完整代码,最后拆解知识点。

修正后的完整可运行代码

#include <stdio.h>
#include <string.h>
#include <stdbool.h>  // 划重点:必须包含这个头文件才能用bool类型

int main() {
    bool has_letter = false;  // 改个更直观的变量名,代替alpha
    bool has_digit = false;
    bool need_reinput = true;  // 用need_reinput代替nogo,可读性拉满
    char password[99];
    int length;
    int i;

    while(need_reinput) {
        // 每次循环重置状态,避免上一次的结果影响这次检查
        has_letter = false;
        has_digit = false;
        need_reinput = false;  // 默认假设密码有效,除非检查出问题

        printf("Password checker 1.1\n");
        printf("Please enter a password you would like to test:\n");
        scanf("%s", password);  // 去掉原始代码里多余的\n,否则输入会出问题

        length = strlen(password);  // 必须在输入密码后再计算长度!原始代码里写在前面是未初始化的垃圾值
        printf("Your password length: %d\n", length);

        // 第一关:检查长度是否合规
        if(length < 8) {
            printf("Oops! Password is too short (needs at least 8 characters). Please re-enter.\n");
            need_reinput = true;
            continue;  // 直接跳去下一次循环,不用再检查后面的条件
        }
        if(length > 20) {
            printf("Oops! Password is too long (max 20 characters allowed). Please re-enter.\n");
            need_reinput = true;
            continue;
        }

        // 第二关:检查是否同时包含字母和数字
        for(i = 0; i < length; i++) {
            // 判断是否是字母(大小写都算)
            if((password[i] >= 'a' && password[i] <= 'z') || (password[i] >= 'A' && password[i] <= 'Z')) {
                has_letter = true;
            }
            // 判断是否是数字
            else if(password[i] >= '0' && password[i] <= '9') {
                has_digit = true;
            }
            // 提前终止循环:如果已经同时有字母和数字了,就不用再遍历了
            if(has_letter && has_digit) {
                break;
            }
        }

        // 校验字母数字的结果
        if(!has_letter || !has_digit) {
            printf("Oops! Password needs at least one letter and one digit. Please re-enter.\n");
            need_reinput = true;
        } else {
            printf("Great! Your password is valid 🎉\n");
        }
    }

    return 0;
}

逐个拆解你关心的核心知识点

1. bool类型怎么用?

  • 首先必须包含<stdbool.h>头文件,C标准里默认没有bool,这个头文件帮我们定义了bool、true、false这些关键字。
  • bool是布尔类型,只有两个取值:true(代表“真”,对应数值1)和false(代表“假”,对应数值0)。
  • 用来标记状态超级合适!比如用has_letter标记密码里有没有字母,need_reinput标记是否需要用户重新输入,比用int类型的0/1直观太多,代码可读性直接up。

2. if语句如何做输入有效性校验?

  • if就是用来做条件判断的:当满足某个条件时,执行对应的代码块。
  • 在密码校验里,我们用它做分层检查:
    • 第一层先卡长度:长度不符合直接提示错误,用continue跳过后续检查,直接进入下一次循环,避免做无用功。
    • 第二层检查字符组成:遍历每个字符,标记是否有字母和数字,最后用if判断是否同时满足两个条件。
  • 可以用else if或者单独的if,根据逻辑复杂度来选——这里长度的两个条件是互斥的,用单独的if也没问题。

3. while语句怎么控制循环直到输入有效?

  • while(need_reinput)的逻辑是:只要need_reinput为true,就重复执行循环体里的代码。
  • 初始化时把need_reinput设为true,这样第一次会进入循环让用户输入密码。
  • 每次循环开头先把need_reinput设为false(默认假设密码是有效的),然后如果检查出任何不符合的情况,再把它设为true,这样循环就会继续,让用户重新输入。
  • 当所有校验都通过时,need_reinput保持false,循环结束,程序就退出啦。

额外小建议

  • 如果你想支持带空格的密码,别用scanf("%s")了,换成fgets(password, sizeof(password), stdin),记得处理fgets会读取末尾的换行符(可以用strcspn去掉)。
  • 还可以扩展校验规则,比如检查是否包含特殊字符(比如!@#$%^&*),让密码更安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:12:12