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; }
主要改动说明:
- 调整
pw数组为char类型,适配字符存储需求 - 引入
<ctype.h>头文件,确保isupper函数可以正常调用 - 将
scanf的格式符改为%s读取完整密码 - 调整循环判断条件,匹配字符串遍历逻辑
- 将
pwnum++移出大写判断分支,每轮循环都后移一位下标
内容的提问来源于stack exchange,提问作者MegaNoob
相关产品推荐
相关产品推荐

