Почему мой код проверки пароля работает неправильно? Он дает одинаковый вывод независимо от того, какой ввод
Я сделал программу проверки паролей, которая проверяет следующие критерии:
Должен иметь по крайней мере
- 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++;}
}