我编写了一个程序,该程序应该检查输入的密码是否包含大写字母,小写字母和数字。如果密码有效,它将不返回任何内容;如果密码无效,则应显示“无效密码!”。但是该程序不起作用,我也不明白为什么。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main()
{
char pass[20];
int a, i=0;
printf("Enter your password. It must contain an uppercase and a lowercase letter with a number. Password should be less than 19 characters.\n ");
scanf(" %s", pass);
a = strlen(pass);
/* Checking if an uppercase letter is present*/
for(i=0; i<a ; i++)
{
if(!isupper(pass[i] && i!=(a-1)))
{
continue;
}
else if (!isupper(pass[i]))
{
printf("Not a valid Password!");
}
else
{
break;
}
}
/* Checking if a lowercase letter is present */
for(i=0; i<a ; i++)
{
if(!islower(pass[i] && i!=(a-1)))
{
continue;
}
else if (!islower(pass[i]))
{
printf("Not a valid Password!");
}
else
{
break;
}
}
/* Checking if a number is present*/
for(i=0; i<a ; i++)
{
if(!isdigit(pass[i] && i!=(a-1)))
{
continue;
}
else if (!isdigit(pass[i]))
{
printf("Not a valid Password!");
}
else
{
break;
}
}
}
答案 0 :(得分:2)
您似乎已经复制了检查大写字母的循环代码,并在其他循环中使用了它。每个循环中的else if
部分包含完全相同的条件。
一种更好的方法是使用三个标志:
int lower_flag = 0, upper_flag = 0, digit_flag = 0;
for(i=0 ; i<a ; i++) {
if(isupper(pass[i])) upper_flag=1;
else if(islower(pass[i])) lower_flag=1;
else if(isdigit(pass[i])) digit_flag=1;
}
if(upper_flag && lower_flag && digit_flag)
printf("Valid");
else
printf("Invalid");
答案 1 :(得分:1)
在您的情况下,您不需要3个循环来检查有效密码。
您可以通过一个循环执行以下操作。您只需要3个bool
变量即可在您的密码中标记upper,lower & digits
的存在。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include<stdbool.h>
int main()
{
char pass[20];
int a, i=0;
bool upperPresent = false,lowerPresent = false,digitPresent = false;
printf("Enter your password. It must contain an uppercase and a lowercase letter with a number. Password should be less than 19 characters.\n ");
scanf(" %s", pass);
a = strlen(pass);
/* Checking if an uppercase letter is present*/
for(i=0; i<a ; i++){
if(isupper(pass[i])){
upperPresent = true;
}
else if (islower(pass[i])){
lowerPresent = true;
}else if (isdigit(pass[i])){
digitPresent = true;
}
}
if (upperPresent && lowerPresent && digitPresent)
printf("Valid password\n");
else
printf("invalid Password\n");
}
答案 2 :(得分:0)
为什么不添加一个布尔值,如果找到一个上限,下限或一个数字然后退出循环,则会触发该布尔值,因为现在您只是遍历整个字符串。另外,您还要在第三循环中检查鞋面。