有关密码验证的C程序不起作用

时间:2018-08-22 11:31:27

标签: c validation passwords

我编写了一个程序,该程序应该检查输入的密码是否包含大写字母,小写字母和数字。如果密码有效,它将不返回任何内容;如果密码无效,则应显示“无效密码!”。但是该程序不起作用,我也不明白为什么。

#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;
    }
  }
}  

3 个答案:

答案 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)

为什么不添加一个布尔值,如果找到一个上限,下限或一个数字然后退出循环,则会触发该布尔值,因为现在您只是遍历整个字符串。另外,您还要在第三循环中检查鞋面。