Как проверить надежность пароля в C ++ с помощью функций bool - PullRequest
0 голосов
/ 01 мая 2020

Работа над упражнением для моего класса. Мой учитель хочет, чтобы мы работали со строкой C, а не с классом строк. Мы должны использовать функции bool и команды C -string, чтобы определить, достаточно ли надежен пароль. Я думаю, что я почти закончил, но у меня где-то должна быть ошибка Вот что у меня получилось:

#include <iostream>
#include <cstring>
#include <cctype>

bool checklength(char[]);
bool checkdigit(char[]);
bool checklower(char[]);
bool checkupper(char[]);
bool checkspecial(char[]);

int main()
{
char pwdstr[20];

std::cout << "Enter your password\n";
std::cin >> pwdstr;

if (checklength(pwdstr) &&
    checkdigit(pwdstr) &&
    checklower(pwdstr) &&
    checkupper(pwdstr) &&
    checkspecial(pwdstr))
{
    std::cout << "Your password is strong.\n";
}

else
{
    std::cout << "Your password is too weak!\n";
}
}

bool checklength(char p[])
{
int i;
int len = strlen(p);

for (i = 0; i < len - 1;)
{
    if (isalnum(p[i]))
    {
        i++;
    }
}

if (i < 6)
{
    std::cout << "Your password must be at least 6 characters 
long.\n";
    return false;
}
else
{
    return true;
}
}

bool checkdigit(char p[])
{
int i;
int len = strlen(p);

for (i = 0; i < len - 1;)
{
    if (isdigit(p[i]))
    {
        i++;
    }
}

if (i < 1)
{
    std::cout << "Your password must have at least 1 digit in 
it.\n";
    return false;
}
else
{
    return true;
}
}

bool checklower(char p[])
{
int i;
int len = strlen(p);

for (i = 0; i < len - 1;)
{
    if (islower(p[i]))
    {
        i++;
    }
}

if (i < 1)
{
    std::cout << "Your password must have at least 1 lower case 
letter in it.\n";
    return false;
}
else
{
    return true;
}
}

bool checkupper(char p[])
{
int i;
int len = strlen(p);

for (i = 0; i < len - 1;)
{
    if (isupper(p[i]))
    {
        i++;
    }
}

if (i < 1)
{
    std::cout << "Your password must have at least 1 upper case 
letter in it.\n";
    return false;
}
else
{
    return true;
}
}

bool checkspecial(char p[])
{
int i;
int len = strlen(p);

for (i = 0; i < len - 1;)
{
    if (ispunct(p[i]))
    {
        i++;
    }
}

if (i < 1)
{
    std::cout << "Your password must have at least 1 special 
character in it.\n";
    return false;
}
else
{
    return true;
}
}

Мой текущий вывод до того, как я добавил описания того, что пошло не так, до возвращения false, заключался в том, что по какой-то причине все было правильно. Теперь все, что я пытаюсь сказать, говорит о том, что у меня не работает функция checklength, что пароль слишком короткий.

Спасибо всем

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Все ваши циклы неверны, вы путаете индекс символа, который вы тестируете, со счетчиком количества символов, прошедших тест, для этого вам нужны отдельные переменные. Кроме того, у вас есть ошибка по длине строки, у вас было len - 1 вместо len. Так что

bool checklength(char p[])
{
    int i;
    int len = strlen(p);

    for (i = 0; i < len - 1;)
    {
        if (isalnum(p[i]))
        {
            i++;
        }
    }

    if (i < 6)
    {
        std::cout << "Your password must be at least 6 characters long.\n";
        return false;
    }
    else
    {
        return true;
    }
}

должно быть

bool checklength(char p[])
{
    int count = 0;
    int len = strlen(p);        
    for (int i = 0; i < len; i++)
    {
        if (isalnum(p[i]))
            count++;
    }
    if (count < 6)
    {
        std::cout << "Your password must be at least 6 characters long.\n";
        return false;
    }
    else
    {
        return true;
    }
}
0 голосов
/ 01 мая 2020

Ваши функции могут быть немного упрощены с помощью алгоритмов STL. Например, checklength может быть:

bool checklength(char p[])
{
  return std::count_if(p, p + strlen(p), [](unsigned char c) {
                        return std::isalnum(c); 
                       }) >= 6;
}

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

...