#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
int longitud = 10;
int mayusculas = 1;
int minusculas = 1;
int digitos = 1;
int especiales = 1;
#define CARACTERES_ESPECIALES "!@#$^&*?"
int tam_alfabeto = 0;
if (mayusculas) tam_alfabeto += 'Z' - 'A' + 1;
if (minusculas) tam_alfabeto += 'z' - 'a' + 1;
if (digitos) tam_alfabeto += 10;
if (especiales
) tam_alfabeto
+= strlen(CARACTERES_ESPECIALES
);
char * alfabeto
= (char*)malloc((tam_alfabeto
+ 1) * sizeof(char)); int index = 0;
for (char c='A'; c<='Z' && mayusculas; c++)
alfabeto[index++] = c;
for (char c='a'; c<='z' && minusculas; c++)
alfabeto[index++] = c;
for (char c='0'; c<='9' && digitos; c++)
alfabeto[index++] = c;
for (int i
=0; i
<(int)strlen(CARACTERES_ESPECIALES
); i
++) alfabeto[index++] = CARACTERES_ESPECIALES[i];
alfabeto[index] = 0; // Solo para fines de depuraciĆ³n
printf("Alfabeto: %s\n", alfabeto
);
int clave_ok;
char*clave
= (char*)malloc((longitud
+1)*sizeof(char)); clave[longitud] = 0; // Finalizamos la cadena
do
{
for( int i=0; i<longitud; i++)
{
clave
[i
] = alfabeto
[rand()%tam_alfabeto
]; }
int hay_mayusculas = 0;
int hay_minusculas = 0;
int hay_digitos = 0;
int hay_especiales = 0;
for (int i=0; i<longitud; i++)
{
hay_mayusculas |= (clave[i] >= 'A' && clave[i] <= 'Z');
hay_minusculas |= (clave[i] >= 'a' && clave[i] <= 'z');
hay_digitos |= (clave[i] >= '0' && clave[i] <= '9');
hay_especiales
|= (strchr(CARACTERES_ESPECIALES
, clave
[i
]) != NULL
); }
clave_ok = 1;
if (mayusculas) clave_ok &= hay_mayusculas;
if (minusculas) clave_ok &= hay_minusculas;
if (digitos) clave_ok &= hay_digitos;
if (especiales) clave_ok &= hay_especiales;
if (!clave_ok)
{
printf("Clave no valida: %s\n", clave
); }
} while (!clave_ok);
printf("Clave generada: %s\n", clave
); }
I2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dGltZS5oPgoKaW50IG1haW4oKQp7CiAgICBpbnQgbG9uZ2l0dWQgPSAxMDsKICAgIAogICAgaW50IG1heXVzY3VsYXMgPSAxOwogICAgaW50IG1pbnVzY3VsYXMgPSAxOwogICAgaW50IGRpZ2l0b3MgPSAxOwogICAgaW50IGVzcGVjaWFsZXMgPSAxOwogICAgCiAgICAjZGVmaW5lIENBUkFDVEVSRVNfRVNQRUNJQUxFUyAiIUAjJF4mKj8iCgogICAgaW50IHRhbV9hbGZhYmV0byA9IDA7CiAgICBpZiAobWF5dXNjdWxhcykgdGFtX2FsZmFiZXRvICs9ICdaJyAtICdBJyArIDE7CiAgICBpZiAobWludXNjdWxhcykgdGFtX2FsZmFiZXRvICs9ICd6JyAtICdhJyArIDE7CiAgICBpZiAoZGlnaXRvcykgICAgdGFtX2FsZmFiZXRvICs9IDEwOwogICAgaWYgKGVzcGVjaWFsZXMpIHRhbV9hbGZhYmV0byArPSBzdHJsZW4oQ0FSQUNURVJFU19FU1BFQ0lBTEVTKTsKCiAgICBjaGFyICogYWxmYWJldG8gPSAoY2hhciopbWFsbG9jKCh0YW1fYWxmYWJldG8gKyAxKSAqIHNpemVvZihjaGFyKSk7CiAgICBpbnQgaW5kZXggPSAwOwoKICAgIGZvciAoY2hhciBjPSdBJzsgYzw9J1onICYmIG1heXVzY3VsYXM7IGMrKykKICAgICAgICBhbGZhYmV0b1tpbmRleCsrXSA9IGM7CiAgICAKICAgIGZvciAoY2hhciBjPSdhJzsgYzw9J3onICYmIG1pbnVzY3VsYXM7IGMrKykKICAgICAgICBhbGZhYmV0b1tpbmRleCsrXSA9IGM7CgogICAgZm9yIChjaGFyIGM9JzAnOyBjPD0nOScgJiYgZGlnaXRvczsgYysrKQogICAgICAgIGFsZmFiZXRvW2luZGV4KytdID0gYzsKCiAgICBmb3IgKGludCBpPTA7IGk8KGludClzdHJsZW4oQ0FSQUNURVJFU19FU1BFQ0lBTEVTKTsgaSsrKQogICAgICAgIGFsZmFiZXRvW2luZGV4KytdID0gQ0FSQUNURVJFU19FU1BFQ0lBTEVTW2ldOyAKICAgIAogICAgYWxmYWJldG9baW5kZXhdID0gMDsgLy8gU29sbyBwYXJhIGZpbmVzIGRlIGRlcHVyYWNpw7NuCgogICAgcHJpbnRmKCJBbGZhYmV0bzogJXNcbiIsIGFsZmFiZXRvKTsKICAgIAogICAgc3JhbmQodGltZShOVUxMKSk7CiAgICAKICAgIGludCBjbGF2ZV9vazsKICAgIGNoYXIqY2xhdmUgPSAoY2hhciopbWFsbG9jKChsb25naXR1ZCsxKSpzaXplb2YoY2hhcikpOwogICAgY2xhdmVbbG9uZ2l0dWRdID0gMDsgLy8gRmluYWxpemFtb3MgbGEgY2FkZW5hCgogICAgZG8KICAgIHsKICAgICAgICBmb3IoIGludCBpPTA7IGk8bG9uZ2l0dWQ7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGNsYXZlW2ldID0gYWxmYWJldG9bcmFuZCgpJXRhbV9hbGZhYmV0b107CiAgICAgICAgfQogICAgCiAgICAgICAgaW50IGhheV9tYXl1c2N1bGFzID0gMDsKICAgICAgICBpbnQgaGF5X21pbnVzY3VsYXMgPSAwOwogICAgICAgIGludCBoYXlfZGlnaXRvcyAgICA9IDA7CiAgICAgICAgaW50IGhheV9lc3BlY2lhbGVzID0gMDsKCiAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxvbmdpdHVkOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBoYXlfbWF5dXNjdWxhcyB8PSAoY2xhdmVbaV0gPj0gJ0EnICYmIGNsYXZlW2ldIDw9ICdaJyk7CiAgICAgICAgICAgIGhheV9taW51c2N1bGFzIHw9IChjbGF2ZVtpXSA+PSAnYScgJiYgY2xhdmVbaV0gPD0gJ3onKTsKICAgICAgICAgICAgaGF5X2RpZ2l0b3MgICAgfD0gKGNsYXZlW2ldID49ICcwJyAmJiBjbGF2ZVtpXSA8PSAnOScpOwogICAgICAgICAgICBoYXlfZXNwZWNpYWxlcyB8PSAoc3RyY2hyKENBUkFDVEVSRVNfRVNQRUNJQUxFUywgY2xhdmVbaV0pICE9IE5VTEwpOwogICAgICAgIH0KICAgIAogICAgICAgIGNsYXZlX29rID0gMTsKICAgICAgICBpZiAobWF5dXNjdWxhcykgY2xhdmVfb2sgJj0gaGF5X21heXVzY3VsYXM7CiAgICAgICAgaWYgKG1pbnVzY3VsYXMpIGNsYXZlX29rICY9IGhheV9taW51c2N1bGFzOwogICAgICAgIGlmIChkaWdpdG9zKSAgICBjbGF2ZV9vayAmPSBoYXlfZGlnaXRvczsKICAgICAgICBpZiAoZXNwZWNpYWxlcykgY2xhdmVfb2sgJj0gaGF5X2VzcGVjaWFsZXM7CgogICAgICAgIGlmICghY2xhdmVfb2spCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIkNsYXZlIG5vIHZhbGlkYTogJXNcbiIsIGNsYXZlKTsKICAgICAgICB9CiAgICB9IHdoaWxlICghY2xhdmVfb2spOwoKICAgIHByaW50ZigiQ2xhdmUgZ2VuZXJhZGE6ICVzXG4iLCBjbGF2ZSk7CiAgICBmcmVlKGNsYXZlKTsKfQ==