¡Hola! hice este programa para practicar con argc y argv y poder pasar parámetros a consola, mediante generaciones de claves, la primera parte del código la he utilizado para el 1º parámetro (que siempre va a ser fijo y por eso lo tengo apartado del otro for) que tiene que ser la longitud de la contraseña (donde el usuario mediante el número que el ponga así se generará la longitud de su clave. -10, -20...). He hecho el ciclo for para que el parámetro 1 siempre sea el de la longitud (ya que luego tengo más), y después he usado el isdigit para que reciba el char que en este caso va a ser el número de la longitud de la clave que va a querer el usuario. Pero me gustaría saber si hay alguna manera o función que con lo que llevo hecho pueda cargar el tamaño de la clave desde ahí y que luego mande el mensaje de error:
Código (c) [Seleccionar]
/*El 1º parámetro siempre va a ser la longitud de la clave*/
for (int i=1; i<argc; i++){
if (isdigit (*argv[1])){
//¿Poder cargar el tamaño de la clave?
}
else{
printf("Primero debes indicarle una longitud a la contrase%ca.", 164);
exit(-1);
}
}
Código (c) [Seleccionar]
#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;
#define CARACTERES_ESPECIALES "!@#$^&*?"
/*El 1º parámetro siempre va a ser la longitud de la clave*/
for (int i=1; i<argc; i++){
if (isdigit (*argv[1])){
//???
}
else{
printf("Primero debes indicarle una longitud a la contrase%ca.", 164);
exit(-1);
}
}
/*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], "-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{
printf("Clave no v%clida.", 160);
exit(-1);
}
}
/*Creamos el alfabeto de todos los parámetros para luego hacer la clave 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 clave*/
srand(time(NULL));
int clave_ok;
char*clave = (char*)malloc((argc+1)*sizeof(char));
for( int i=0; i<argc; i++){
clave[i] = alfabeto[rand()%tam_alfabeto];
}
clave[argc] = 0; // Finalizamos la cadena
}