Trabajando en un ejercicio para mi clase. Mi maestra quiere que trabajemos con C-string, no con la clase string. Debemos usar funciones bool y comandos C-string para determinar si una contraseña es lo suficientemente segura. Creo que estoy cerca de terminar pero debo tener algún error en alguna parte. Esto es lo que tengo:

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

Mi salida actual antes de agregar las descripciones de lo que salió mal antes de devolver falso fue que todo era correcto por alguna razón. Ahora todo lo que intento dice que estoy fallando en la función checklength, que la contraseña es demasiado corta.

Gracias a todos

0
SalvGi 1 may. 2020 a las 23:05

2 respuestas

Todos tus bucles están equivocados, estás confundiendo el índice del personaje que estás probando, con el recuento de la cantidad de caracteres que han pasado la prueba, necesitas variables separadas para esto. Además, tiene una salida por error en la longitud de la cadena, tenía len - 1 en lugar de len. Así que esto

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

Debería ser esto

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;
    }
}
1
john 1 may. 2020 a las 20:26

Sus funciones podrían simplificarse bastante con los algoritmos STL. p.ej. checklength podría ser:

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

Y podrías hacer cosas similares para las otras funciones.

0
cigien 1 may. 2020 a las 20:24