[Solucionado] Parametros desde consola

Iniciado por sabeeee, 2 Enero 2015, 04:07 AM

0 Miembros y 1 Visitante están viendo este tema.

sabeeee

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
int main()
{

char clave[6];
printf("Escriba su clave: ");
scanf("%s",clave);
if(strcmp(clave,"passbasico")==0)
{
system("echo sencillo a ejecutar");
printf("\n");
}
else
{
printf("Clave no valida");
}

return 0;
}


Hola soy nuevo en C y quisiera hacer algo así pero que en vez de que sea desde el mismo programa se pueda poner un parámetro externo "-pass passbasico" desde una consola por ejemplo.
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

engel lex

Código (cpp) [Seleccionar]
int main(int argc, char** argv)

El argc contiene la cantidad de argumentos pasados,  argv contiene un array  de lo pasado siendo 0 el archivo en si mismo y el resto lo que fue pasado con espacios
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Yoel Alejandro

Ya va no entiendo bien, quieres que el "parámetro externo" sea el password que introduce el usuario, o sea el password correcto o consigna con el cual debe cotejarse el que introduzca el usuario.

Si es lo segundo, (intuyo que quieres llamar a este programa desde otro programa, que le indique cuál es la clave correcta a considerar) quedaría como:
Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc, char **argv)
{

   char clave[21];             /* espacio para 20 caracteres, pues 5 es muy poco */
   char clave2[21]; /* clave del usuario */
   if ( argc < 3 ) { /* salir si hay menos de tres argumentos */
      printf("faltan argumentos\n");
      return 1;
   }

   if ( !strcmp( argv[1], "-pass" ) ) {
      strncpy( clave, argv[2], 20 );
      clave[21] = '\0';
   }
   else
      return 1;

   printf("Escriba su clave: ");
   scanf("%s", clave2);
   while ( getchar() != '\n' ) ;

   if ( !strcmp(clave, clave2) ) /* <-- ve aqui */
   {
      printf("sencillo a ejecutar\n");
   }
   else
   {
      printf("Clave no valida\n");
   }

   return 0;
}


Con te explicó engel, la declaración
Código (cpp) [Seleccionar]

int main(int argc, char** argv)

se usa para leer argumentos de main por consola. El primer argumento argc corresponde al número de argumentos leidos, en este caso 3. Pues el propio nombre de tu programa se considera como un argumento. El segundo argv es un arreglo de cadenas, donde cada cadena corresponde a uno de los argumentos pasados al programa. Ejemplo:

myprograma -pass xyz

entonces, argc vale 3, y los elementos del array argv serán:

en argv[0], la cadena "my programa"
en argv[1], la cadena "-pass"
en argv[2], la cadena "xyz"


Ya con esta explicación creo que se entiende el resto del código fuente que te suministré. Al compilar y probarlo verás:

./test -pass xyz
Escriba su clave: xyz
sencillo a ejecutar

pues, se pide cotejar con la clave "xyz". Si introduce una clave distinta a la esperada:

./test -pass xyz
Escriba su clave: abc
Clave no valida


Pequeñas observaciones:

  • Como uso Linux, antecedo el nombre de programa a ejecutar con "./", pero tú no lo necesitas en Windows.
  • La longitud de clave es muy pequeña, la cambié a 21, o sea 20 caracteres más el NULO de terminación. Nunca se te olvide sumar el NULO de terminación.
  • strcpy() requiere la cabecera <string.h>
  • ¿¿¿Para qué haces: system("echo sencillo a ejecutar")??? ... Es lo mismo que printf("sencillo de ejecutar\n"), y no se si has leído que se debe evitar en lo posible el uso de la orden system por ser muy dependiente del SO.

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

sabeeee

#3
Excelente entonces, eliminaría el scanf y seria:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc, char **argv)
{

   char clave[21];             /* espacio para 20 caracteres, pues 5 es muy poco */
   char clave2[21] = "hola"; /* clave del usuario */
   if ( argc < 3 ) { /* salir si hay menos de tres argumentos */
      printf("USO: programa -pass \"clave\" \n");
      return 1;
   }

   if ( !strcmp( argv[1], "-pass" ) ) {
      strncpy( clave, argv[2], 20 );
      clave[21] = '\0';
   }
   else
      return 1;

   if ( !strcmp(clave, clave2) )
   {
      printf("sencillo a ejecutar\n");
   }
   else
   {
      printf("Clave no valida\n");
   }

   return 0;
}
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

Yoel Alejandro

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

sabeeee

#5
Muchas gracias a ambos, recomendaría agregar esto a la lista de ejemplos, para los novatos como yo es un poco difícil.  ;D
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

Yoel Alejandro

 ;-) ;-) ;-) Por nada amigo.

Por cierto, esa sintaxis que definiste "test -pass xyz" con el guión antes de la opción se parece a la típica de los comandos de UNIX y derivados. En Windows creo que es más usual el "/" (o sea "/pass" )

Visto que es así, y por lo visto tienes un alma inquieta y ávida de programación, ¿no has pensado en explorar Linux?
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

sabeeee

#7
yoel_alejandro, te comento, yo soy de Argentina, y a los estudiantes de secundaria (creo que en algunos países es universidad), nos regalan netbooks con la condición de que terminemos la escuela, y porque hay gente desafortunada que nunca pudo tener un ordenador (afortunadamente cada vez son menos), lo cual es excelente (cada vez con mejores especificaciones técnicas). Poseen Windows 7 (2015 traen Windows 8 sino me equivoco y 4gb de ram!) y una distro Huayra, basada en Ubuntu (creo) y es por eso y por una cuestión de "portabilidad" de que intento de que todos mis códigos sean compatibles con Linux, del cual yo no entiendo mucho pero me encantaría saber y el VirtualBox no me va, cuando tenga la net lo pruebo, la mande a desbloquear porque incluyen un chip TPM (hay muchos mitos y leyendas urbanas sobre el jajaja), para evitar ser robada, el cual es muy difícil de corromper, en las net nuevas (mi caso) y es verano acá por eso es que estamos de vacaciones, la escuela esta cerrada jajaja, voy por el ultimo añito ya.

Veo que vos sabes mucho de C/C++, venís ayudando a todos, quizás te venga bien un cargo de "Colaborador" por lo menos ja.

Edit esto es lo que te digo:
http://www.taringa.net/posts/info/18186947/La-nueva-net-del-gobierno-2014-2015-con-4gb-de-ram.html

http://ark.intel.com/es/products/79050/Intel-Celeron-Processor-N2806-1M-Cache-up-to-2_00-GHz

https://www.youtube.com/watch?v=QcP-WS8wU20
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

Yoel Alejandro

Mmmm, se parece al programa que tiene el gobierno de Venezuela (mi país) con equipos llamados "Canaima", y un SO que dicen propio pero me parece más un clon de Ubuntu y encima sin dar los créditos, ......., en fin así son los políticos.

Sí, trato de ayudar a los que puedo y sería un honor recibir el título de Colaborador, aunque no conozco los requisitos necesarios para ello.

Y aunque no lo parezca, ayudando también se gana, he aprendido mucho respondiendo las preguntas aquí en el foro  :)

Saludos!
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)