elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  C++ argumentos en el main.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: C++ argumentos en el main.  (Leído 3,976 veces)
#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
C++ argumentos en el main.
« en: 7 Mayo 2014, 05:23 am »

Muy buenas, estos días he estado practicando con c++, y me surgió un problema, mi intención es leer un string, y tranformar carácter por carácter a ASCII, si este es par, sumarle 1 y devolver el caracter, y si es impar, restarle uno y más de lo mismo.

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. char transformar_caracter(char letra){
  6.  
  7.    int n = int(letra);
  8.  
  9.    if (n%2 == 0){
  10.        n++;
  11.    }else{
  12.        n--;
  13.    }
  14.    return char(n);
  15. }
  16.  
  17. int main(){
  18.    if(argc < 2){
  19.            return false;
  20.    }
  21.  
  22.    string frase;
  23.    getline(cin, frase);
  24.  
  25.    int tam = frase.size();
  26.  
  27.  
  28.    for(int i=0; i<tam; i++){
  29.    cout << transformar_caracter(frase[i]);
  30.    }
  31. }

Hasta aquí funciona a la perfección, pero mi intención es ejecutarlo desde la consola. Para eso cambie el código añadiendo los argumentos típicos del main.

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. char transformar_caracter(char letra){
  6.  
  7.    int n = int(letra);
  8.  
  9.    if (n%2 == 0){
  10.        n++;
  11.    }else{
  12.        n--;
  13.    }
  14.    return char(n);
  15. }
  16.  
  17. int main(int argc, char *argv[]){
  18.    if(argc < 2){
  19.            return false;
  20.    }
  21.  
  22.    string frase = argv[1];
  23.    // getline(cin, frase);
  24.  
  25.    int tam = frase.size();
  26.  
  27.  
  28.    for(int i=0; i<tam; i++){
  29.    cout << transformar_caracter(frase[i]);
  30.    }
  31. }

El problema se encuentra en la linea 23, básicamente, antes usaba Getline para así leer toda la linea, y que el string no se parase al leer el espacio, ahora el problema está en que al ejecutarlo por consola,  únicamente lee hasta el espacio y no encuentro forma de usar el getline como argumento.

No sé si me explico...

Gracias de antemano!.


En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: C++ argumentos en el main.
« Respuesta #1 en: 7 Mayo 2014, 05:42 am »

no entiendo... si ya capturas el mensaje por consola, entonces para que quieres el getline?


En línea

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.
#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: C++ argumentos en el main.
« Respuesta #2 en: 7 Mayo 2014, 05:47 am »

no entiendo... si ya capturas el mensaje por consola, entonces para que quieres el getline?

Supongo que me expliqué mal. Lo que digo es que si lo hago sin argumentos con el getline capturo toda la linea y funciona sin problema, pero mi intencion es hacerlo desde el terminal.

al no usar getline, solo captura UN UNICO string, de forma que si en la consola escribo:

Ruta/Programa Hola que tal

La consola me devuelve el Hola modificado pero ignora todo lo que hay después del espacio.

Espero haberme explicado ahora mejor >_<

Intenté solucionarlo con

Código
  1. int main(int argc, char *argv[]){
  2.    if(argc < 2){
  3.            return false;
  4.    }
  5.    int argumento = 1;
  6.    string frase[100];
  7.  
  8.    for(int it = 0; it < 101; it++) {
  9.        frase[it] = argv[argumento];
  10.        argumento++;
  11.  
  12.    int tam = frase[it].size();
  13.  
  14.  
  15.    for(int i=0; i<tam; i++){
  16.    cout << transformar_caracter(frase[it][i]);
  17.        }
  18.    }
  19. }

Funciona pero el programa revienta y da un error de windows xD...

EDITO

Finalmente se me ocurrió hacer lo tipico de "Secuencias con centinela", y salir del programa cuando el usuario escriba una palabra en particular, en este caso !stop, en este caso me aseguro que si el string tiene una tabla de 100, y se usan 90, el for no recorra a la 91 y windows tire error, aún así me parece muuuy chapuza y me gustaría que alguien me pudiese dar una mejor solución.

Aquí dejo el código por si a alguien le interesa.

Código
  1. int main(int argc, char *argv[]){
  2.    if(argc < 2){
  3.            return false;
  4.    }
  5.    int argumento = 1;
  6.    string frase[100];
  7.  
  8.    for(int it = 0; it < 100; it++) {
  9.        frase[it] = argv[argumento];
  10.        argumento++;
  11.  
  12.        if(frase[it] == "!stop"){return false;}
  13.  
  14.    int tam = frase[it].size();
  15.  
  16.  
  17.    for(int i=0; i<tam; i++){
  18.    cout << transformar_caracter(frase[it][i]);
  19.        }
  20.    }
  21. }

Saludos!
« Última modificación: 7 Mayo 2014, 06:15 am por #Aitor » En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: C++ argumentos en el main.
« Respuesta #3 en: 7 Mayo 2014, 09:04 am »

No he terminado de comprender el motivo por el cual usas la cabecera de entrada salida de C++ y luego usas las funciones de C en vez de cin y cout.

Código
  1. for(int it = 0; it < 100; it++) {

Estás presuponiendo que te van a pasar 100 palabras... y eso no tiene que ser cierto... el número viene dado por argc, no puedes pasar de esa cantidad.

Es decir, lo que viene siendo...

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. const int MAXSTRINGS = 100;
  7.  
  8. char transformar_caracter(char letra)
  9. {
  10.  if ( letra%2 )
  11.    letra--;
  12.  else
  13.    letra++;
  14.  
  15.  return letra;
  16. }
  17.  
  18. int main(int argc, char **argv )
  19. {
  20.  if(argc < 2)
  21.    return 0;
  22.  
  23.  string frase[ MAXSTRINGS ];
  24.  
  25.  int max = ( argc > MAXSTRINGS ) ? MAXSTRINGS : argc - 1;
  26.  for(int it = 0; it < max; it++)
  27.  {
  28.    frase[it] = argv[ it + 1];
  29.  
  30.    int tam = frase[it].size();
  31.  
  32.    for(int i=0; i<tam; i++)
  33.      cout << transformar_caracter(frase[it][i]);
  34.    cout << "\t"; // Lo he puesto para separar cada palabra
  35.  }
  36.  
  37.  cout << endl;
  38.  return 0;
  39. }

el array "frase" lo he mantenido porque imagino que tu idea es usarlo en cambios futuros... ahora mismo no sería necesario. Yo personalmente hubiese usado un contenedor en vez de un array "crudo", pero así también funciona.
« Última modificación: 7 Mayo 2014, 09:05 am por eferion » En línea

#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: C++ argumentos en el main.
« Respuesta #4 en: 7 Mayo 2014, 14:07 pm »

No he terminado de comprender el motivo por el cual usas la cabecera de entrada salida de C++ y luego usas las funciones de C en vez de cin y cout.

Código
  1. for(int it = 0; it < 100; it++) {

Estás presuponiendo que te van a pasar 100 palabras... y eso no tiene que ser cierto... el número viene dado por argc, no puedes pasar de esa cantidad.

Es decir, lo que viene siendo...

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. const int MAXSTRINGS = 100;
  7.  
  8. char transformar_caracter(char letra)
  9. {
  10.  if ( letra%2 )
  11.    letra--;
  12.  else
  13.    letra++;
  14.  
  15.  return letra;
  16. }
  17.  
  18. int main(int argc, char **argv )
  19. {
  20.  if(argc < 2)
  21.    return 0;
  22.  
  23.  string frase[ MAXSTRINGS ];
  24.  
  25.  int max = ( argc > MAXSTRINGS ) ? MAXSTRINGS : argc - 1;
  26.  for(int it = 0; it < max; it++)
  27.  {
  28.    frase[it] = argv[ it + 1];
  29.  
  30.    int tam = frase[it].size();
  31.  
  32.    for(int i=0; i<tam; i++)
  33.      cout << transformar_caracter(frase[it][i]);
  34.    cout << "\t"; // Lo he puesto para separar cada palabra
  35.  }
  36.  
  37.  cout << endl;
  38.  return 0;
  39. }

el array "frase" lo he mantenido porque imagino que tu idea es usarlo en cambios futuros... ahora mismo no sería necesario. Yo personalmente hubiese usado un contenedor en vez de un array "crudo", pero así también funciona.

Hola gracias por responder, funciona pero no entiendo como >_<

En principio no entiendo esta linea.

Código
  1. int max = ( argc > MAXSTRINGS ) ? MAXSTRINGS : argc - 1;

Y luego no termino de entender, por qué el programa no explota si la idea de

Código
  1. const int MAXSTRINGS = 100;
  2. string frase[ MAXSTRINGS ];

Es la misma idea qué:
Código
  1. string frase[100];

En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: C++ argumentos en el main.
« Respuesta #5 en: 7 Mayo 2014, 14:39 pm »

En principio no entiendo esta linea.

Código
  1. int max = ( argc > MAXSTRINGS ) ? MAXSTRINGS : argc - 1;

Puesto de otra forma:

Código
  1. int max;
  2. if ( argc > MAXSTRINGS )
  3.  max = MAXSTRINGS;
  4. else
  5.  max = argc - 1;

Y luego no termino de entender, por qué el programa no explota si la idea de

Código
  1. const int MAXSTRINGS = 100;
  2. string frase[ MAXSTRINGS ];

Es la misma idea qué:
Código
  1. string frase[100];

Efectivamente es lo mismo. La ventaja que tiene mi código es que puedes cambiar el 100 por cualquier otro valor sin necesidad de navegar por el código (imagínate que tienes que cambiar el 100 en 30 sitios diferentes... con mi código solo tendrías que cambiarlo en un solo sitio)

El motivo por el que ya no explota no está ahí, sino en el bucle:

Código
  1. for(int it = 0; it < max; it++)

En tu versión, estás asumiendo que "max" es siempre 100 y eso es incorrecto... si solo pasas 3 palabras, "max" deberá valer 3, no 100
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: C++ argumentos en el main.
« Respuesta #6 en: 7 Mayo 2014, 14:55 pm »

El problema se encuentra en la linea 23, básicamente, antes usaba Getline para así leer toda la linea, y que el string no se parase al leer el espacio, ahora el problema está en que al ejecutarlo por consola,  únicamente lee hasta el espacio y no encuentro forma de usar el getline como argumento.
Cuando se llama a tu programa con, por ejemplo:
Código:
nombre_del_programa arg_1 arg_2 arg_3
El nombre de este se almacena en argv[0] y los argumentos de la linea de comandos son las palabras que siguen y se acceden con argv[ 1 ] .. argv[argc - 1] (argv[argc] es NULL).

La solución fuera de tu programa es indicar que se pasa un solo argumento, para esto los delimitas con comillas dobles:
Código:
nombre_del_programa "arg_1 arg_2 arg_3"

La solución dentro del programa (no hay forma de recuperar el espacio blanco) es crear la cadena manualmente, solo tienes que concatenar todos los argumentos pasados mediante la linea de comandos, una forma es:
Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4.  
  5. #include <string>
  6. using std::string;
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10.   if (argc > 1){
  11.      string linea = argv[1];
  12.  
  13.      for (char **p = argv + 2; *p; p++)
  14.         linea = linea + ' ' + *p;
  15.  
  16.      cout << linea << endl;
  17.   }
  18.  
  19.   return 0;
  20. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: C++ argumentos en el main.
« Respuesta #7 en: 7 Mayo 2014, 15:06 pm »

Matarme por favor, lamento incordiar tanto.

Ahora no entiendo esto:
Código
  1. int max;
  2. if ( argc > MAXSTRINGS )
  3.  max = MAXSTRINGS;
  4. else
  5.  max = argc - 1;


Entiendo la primera condicion pero no si no se cumple, entiendo que si el numero de argumentos supera a los 100, max tendrá 100 argumentos y no leerá el 101.

Pero no entiendo:

Código
  1.  max = argc - 1;

Por qué el numero de argumentos -1? >_<

y referente a lo que me cuentas rir3760, el código tiene punteros? lo digo por el *p aún no estudié eso.


Código:
El nombre de este se almacena en argv[0] y los argumentos de la linea de comandos son las palabras que siguen y se acceden con argv[ 1 ] .. argv[argc - 1] (argv[argc] es NULL).

?? Me vuelvo a perder en lo de argv[argc - 1], por qué no seguir la lógica y argv[ 2 ]

Lamento molestar tanto de verdad xD...
« Última modificación: 7 Mayo 2014, 15:08 pm por #Aitor » En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: C++ argumentos en el main.
« Respuesta #8 en: 7 Mayo 2014, 16:20 pm »

Pero no entiendo:
Código
  1.  max = argc - 1;
Por qué el numero de argumentos -1?
Porque argc es el numero de argumentos incluyendo el nombre del programa, como este no lo vas a procesar se resta uno.

y referente a lo que me cuentas rir3760, el código tiene punteros? lo digo por el *p aún no estudié eso.
El problema es que argv es de tipo "char **", utilices el operador "*" o "[]" ya están trabajando con punteros.

Me vuelvo a perder en lo de argv[argc - 1], por qué no seguir la lógica y argv[ 2 ]
Porque no puedes saber de antemano el numero de argumentos que se pasaran al programa.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: C++ argumentos en el main.
« Respuesta #9 en: 7 Mayo 2014, 16:32 pm »

Ahora sí lo entendí, no me había quedado claro que argc es el número de argumentos, y me estaba volviendo loco pues no sabia como el bucle sabia que tenía que terminar cuando se acabasen los argumentos.

Ahora todo encaja xD!

Muchísimas gracias a los dos ;P doy el tema como resuelto.

Saludos!
En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
argumentos del main?
Programación C/C++
<<<-Basura->>> 4 6,067 Último mensaje 12 Octubre 2011, 08:43 am
por <<<-Basura->>>
¿Qué significan aquellos parámetros de la lista de argumentos del main ?
Programación C/C++
theluigy13etv 3 3,026 Último mensaje 14 Febrero 2012, 17:41 pm
por rir3760
Argumentos del main
Programación C/C++
mapers 5 3,514 Último mensaje 5 Junio 2012, 22:01 pm
por Ferno
[cagada]: gcc main.c -o main.c. posibilidad de recuperar codigo fuente??
Programación C/C++
xiruko 5 4,688 Último mensaje 3 Agosto 2012, 06:29 am
por xiruko
Duda sobre argumentos para main
Java
reygecko 2 2,386 Último mensaje 21 Diciembre 2012, 08:21 am
por reygecko
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines