Почему мой код проверки пароля работает неправильно? Он дает одинаковый вывод независимо от того, какой ввод

Я сделал программу проверки паролей, которая проверяет следующие критерии:

  • Должен иметь по крайней мере

    • 1 заглавная
    • 1 нижний регистр
    • 1 специальный символ
    • 1 номер
  • Должно быть не более 100 символов

и это все. Я не дал никакого нижнего предела. И независимо от того, какой ввод я даю (правильный или неправильный), программа выдает мне такой же или похожий вывод, как и на моем скриншоте.

Например: Pratik10, pratik10, pratikten, pr@tiK10Я получаю такой же вывод "Password is fine and valid",

Почему моя программа неправильно проверяет определенные условия? Это даже не печать счетчиков пароля правильно.

Ниже приведен мой код:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>

int main()
{
    char x[100];
    int i;
    int uc=0;
    int lc=0;
    int num=0;
    int misc=0;

    printf("enter your password\n");
    scanf("%s",x);

    for(i=0;i<100;i++) {
        if (isalpha(x[i])) {
            if (isupper(x[i])) {
                uc++;
            }
            if (islower(x[i])) {
                lc++;
            }
        }
        if (isdigit(x[i])) {
            num++;
        }
        else {  
            misc++;
        }
    }

    printf("checking your password\n");
    printf("%d uc\n",uc);
    printf("%d lc\n",lc);
    printf("%d num\n",num);
    printf("%d misc\n",misc);

    if ((uc > 0) && (lc > 0) && (num > 0) && (misc > 0)) {
        printf("password is fine and valid\n");
    }
    else {
        if(lc<=0) {
            printf("lowercase character(s) missing cannot proceed without inclusion\n");
        }
        if(uc<=0) {
            printf("uppercase character(s) missing cannot proceed without inclusion\n");
        }
        if(num<=0) {
            printf("number(s) missing cannot proceed without inclusion\n");
        }
        if(misc<=0) {
            printf("special character(s) missing cannot proceed without inclusion\n");
        }
        printf("please include all the missing parameters in combination to validate the password and try again\n\n");
    }

    return 0;
}

Как это исправить?

Выход:

введите описание изображения здесь

3 ответа

Решение

Вы должны проверять только строку с нулевым символом в конце, предоставленную пользователем.

Другими словами, вы должны повторить x пока вы не встретите нулевой символ.


Изменить это:

for (i = 0; i < 100; i++)

К этому:

for (i = 0; x[i] != 0; i++)

Вторая проблема заключается в том, что вы не используете if/else должным образом.

В результате каждый символ, который не является цифрой, считается разным.


Изменить это:

if (isdigit(x[i]))

К этому:

else if (isdigit(x[i]))

Проблема в том, что вы проверяете весь массив, который в основном неинициализирован и содержит все виды символов наугад.

Таким образом, вы должны выйти из цикла, когда вы сталкиваетесь с '\0' персонаж.

Другие ответы затронули основную проблему. Есть еще одна проблема: отсутствует else до if (isdigit(x[i])) {num++;},

for(i=0; x[i]!=0; i++)
{
   if (isalpha(x[i]))
   {
      if (isupper(x[i])) {uc++;}
      if (islower(x[i])) {lc++;}
   }
   else if (isdigit(x[i])) {num++;} // a missing else
   else {misc++;}
}
Другие вопросы по тегам