试图写一个程序,检查密码-它需要至少有1个大写,小写,数字和标点符号,但它似乎拒绝一切,如果它适合确实符合标准。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
bool valid(string password);
int main(void)
{
string password = get_string("Enter your password: ");
if (valid(password))
{
printf("Your password is valid!\n");
}
else
{
printf("Your password needs at least one uppercase letter, lowercase letter, number and symbol\n");
}
}
bool valid(string password)
{
for (int i = 0; i < strlen(password); i++)
{
if(isupper(password[i]) && isalnum(password[i]) && ispunct(password[i]))
{
return true;
}
}
return false;
}
当我分别检查大写字母、数字和标点符号时,它可以工作--但我认为if语句和使用&&可能有问题
2条答案
按热度按时间odopli941#
此if语句
始终计算为false,因为字符不能同时是字母或数字和标点符号。
也就是说,在for循环中只使用一个if语句是不够的。
我可以建议下面的演示程序中显示的解决方案。
程序输出为
rt4zxlrg2#
但它似乎拒绝一切,如果它适合确实符合标准。
一个程序只能做它被编程要做的事情,严格按照法律的规定。
尝试写一个程序,检查密码-它需要至少有1个大写字母,小写字母,数字和标点符号
它不检查字符串中是否至少有一个大写字母、小写字母、数字和标点符号,而是检查
char
是否同时是大写字母、字母表或数字以及标点符号(char
不可能是这些),并在此基础上返回true
/false
。一个简单的解决方案可能是保留一些标志,并通过
char
迭代输入char
,如果ctype
函数返回0,则将它们设置为true
。一旦循环退出,我们就可以评估这些标志,看看密码是否有效: