Tienes que convertir ese parámetro a un número positivo por ejemplo como te ha indicado MAFUS unos mensajes atrás:
En principio lo tengo como me ha dicho MAFUS y sigue aún mostrándome 3 caracteres en vez de los que dice el usuario. Posiblemente sea algún fallo tonto que no estoy viendo o algo así.
EDITO: La variable longitud_clave tal y como se utiliza (y se debe utilizar) en el código citado en este mensaje debe ser de tipo unsigned int, es decir, entero sin signo. Lo que quieres guardar ahí es un número positivo con la longitud de la clave. Si utilizas como parámetro "-10" lo que quieres guardar es 10.
Si... He cambiado cambiado el tipo de la variable por un entero sin signo (menudo fallo).
¡Vale! He arreglado lo de que no me muestre solamente 3 caracteres, el problema se encuentra en que cuando le digo que me muestre 10 caracteres me muestra más o menos de los que deberían e incluso me da una contraseña con símbolos extraños que no tienen nada que ver con el parámetro que le proporciono.
Parece que el problema realmente está en la última parte donde hace una comprobación en la contraseña de si realmente están los parámetros que ha proporcionado el usuario, que no os la he mostrado porque pensaba que no era el problema realmente...
Os dejo todo el código a ver si me podéis ayudar:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <ctype.h>
int main(int argc, char *argv[]){
/* Cada uno de los parámetros necesarios para utilizar en la consola*/
int mayusculas = 0;
int minusculas = 0;
int digitos = 0;
int especiales = 0;
unsigned int longitud_clave;
#define CARACTERES_ESPECIALES "!@#$^&*?"
/* Comprobamos que existe más de un parámetro (el nombre) en la línea de comandos */
if(argc < 3) {
fprintf(stderr
, "%s\n", "Primero, debes introducir la longitud de la clave."); }
/*El 1º parámetro siempre va a ser la longitud de la contraseña*/
if(sscanf(argv
[1], "%u", &longitud_clave
) == 0) { fprintf(stderr
, "%s\n", "El primer parametro debe ser un entero. Vuelve a ingresar la longitud."); }
/*A partir del 2º parámetro pueden ser mayúsculas, minúsculas...*/
for (int i=2; i<argc; i++){
if (strcmp(argv
[i
], "-M") == 0){
mayusculas = 1;
}
else if (strcmp(argv
[i
], "-n") == 0){
minusculas = 1;
}
else if (strcmp(argv
[i
], "-ce") == 0){
especiales = 1;
}
else if (strcmp(argv
[i
], "-d") == 0){
digitos = 1;
}
else if (strcmp(argv
[i
], "-Mn") == 0 || strcmp(argv
[i
], "-nM") == 0){
mayusculas = 1;
minusculas = 1;
}
else if ((strcmp(argv
[i
], "-ndM") == 0) || (strcmp(argv
[i
], "-nMd")) == 0 || ((strcmp(argv
[i
], "-dnM") == 0) || (strcmp(argv
[i
], "-Mnd")) == 0)){
mayusculas = 1;
minusculas = 1;
digitos = 1;
}
else if (strcmp(argv
[i
], "-all") == 0){
mayusculas = 1;
minusculas = 1;
digitos = 1;
especiales = 1;
}
else{
fprintf(stderr
, "Clave no v%clida. Debes utilizar los par%cmetros indicados:", 160, 160); fprintf(stderr
, "\n-M, -n, -ce, -d, -Mn/-nM, -Mnd (y sus combinaciones) y -all"); }
}
/*Creamos el alfabeto de todos los parámetros para luego hacer la contraseña libremente*/
int tam_alfabeto = 1; // Para finalizar la cadena - depuración
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
* 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<strlen(CARACTERES_ESPECIALES); i++)
alfabeto[index++] = CARACTERES_ESPECIALES[i];
alfabeto[index] = 0; // Solo para fines de depuración
/*Generamos la contraseña*/
int clave_ok;
char*clave
= (char*)malloc((*argv
[1]+1)*sizeof(char)); for( int i=0; i<*argv[1]; i++){
clave
[i
] = alfabeto
[rand()%tam_alfabeto
];}
clave[argc] = 0; // Finalizamos la cadena
/*Hacemos una comprobación para que la contraseña tenga los parámetros que queremos*/
do{
for( int i=0; i<*argv[1]; 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<*argv[1]; 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 vaclida: %s\n", clave
); }
} while (!clave_ok);
printf("Clave generada: %s\n", clave
); }
Menudo dolor de cabeza me está dando este código :/