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

C语言入门新手编写密码校验功能时循环遍历字符逻辑异常求助

问题根源

  • 存储密码的数组类型错误:pw定义为int类型数组,无法正确存储输入的字符,应该改为char类型。
  • 输入逻辑错误:scanf(" %c", pw)仅能读取单个字符,要读取完整的密码字符串,需要使用%s格式符。
  • 循环执行逻辑错误:你将下标变量pwnum的自增语句写在了大写字母判断的分支内,只有当前遍历到的字符是大写字母时,下标才会向后移动。如果遇到非大写字母,下标永远不会变化,程序会卡在当前位置停止遍历,自然只会校验第一个符合条件的字符。
  • 循环边界不合理:长度为21的数组合法下标范围是0~20,同时C语言的字符串以\0作为结束标识,遍历到结束标识即可停止,无需遍历到第21位。

修复后的参考代码

#include <stdio.h>
#include <ctype.h>

int main()
{    
     char pw[21];
     int pwnum = 0;

     printf("Please choose a password.\n");
     printf("Make sure it includes at least one number, lower and upper case letter and one of the symbols: !, _, $, -, /.\n");    
     scanf("%s", pw);

     while(pw[pwnum] != '\0' && pwnum < 21){
        if(isupper(pw[pwnum])){
                printf("lol!");
        }
        pwnum++;
     }    
     return 0;
}

主要改动说明:

  1. 调整pw数组为char类型,适配字符存储需求
  2. 引入<ctype.h>头文件,确保isupper函数可以正常调用
  3. 将scanf的格式符改为%s读取完整密码
  4. 调整循环判断条件,匹配字符串遍历逻辑
  5. 将pwnum++移出大写判断分支,每轮循环都后移一位下标

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:15:03