Autor
|
Tema: C++ argumentos en el main. (Leído 4,020 veces)
|
#Aitor
Desconectado
Mensajes: 173
|
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. #include <iostream> using namespace std; char transformar_caracter(char letra){ int n = int(letra); if (n%2 == 0){ n++; }else{ n--; } return char(n); } int main(){ if(argc < 2){ return false; } string frase; getline(cin, frase); int tam = frase.size(); for(int i=0; i<tam; i++){ cout << transformar_caracter(frase[i]); } }
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. #include <iostream> using namespace std; char transformar_caracter(char letra){ int n = int(letra); if (n%2 == 0){ n++; }else{ n--; } return char(n); } int main(int argc, char *argv[]){ if(argc < 2){ return false; } string frase = argv[1]; // getline(cin, frase); int tam = frase.size(); for(int i=0; i<tam; i++){ cout << transformar_caracter(frase[i]); } }
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).while($Se_feliz){ Piensa_un_OBJETIVO(); // Sin excusas! if($Tienes_un_objetivo){ Suspira(); // Sé paciente. if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return; //RETURN; ¿O volvemos a empezar? }else{ Inténtalo_de_nuevo(); } } }
|
|
|
engel lex
|
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
Mensajes: 173
|
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 int main(int argc, char *argv[]){ if(argc < 2){ return false; } int argumento = 1; string frase[100]; for(int it = 0; it < 101; it++) { frase[it] = argv[argumento]; argumento++; int tam = frase[it].size(); for(int i=0; i<tam; i++){ cout << transformar_caracter(frase[it][i]); } } }
Funciona pero el programa revienta y da un error de windows xD... EDITOFinalmente 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. int main(int argc, char *argv[]){ if(argc < 2){ return false; } int argumento = 1; string frase[100]; for(int it = 0; it < 100; it++) { frase[it] = argv[argumento]; argumento++; if(frase[it] == "!stop"){return false;} int tam = frase[it].size(); for(int i=0; i<tam; i++){ cout << transformar_caracter(frase[it][i]); } } }
Saludos!
|
|
« Última modificación: 7 Mayo 2014, 06:15 am por #Aitor »
|
En línea
|
Mi algoritmo en PHP (estupideces y más).while($Se_feliz){ Piensa_un_OBJETIVO(); // Sin excusas! if($Tienes_un_objetivo){ Suspira(); // Sé paciente. if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return; //RETURN; ¿O volvemos a empezar? }else{ Inténtalo_de_nuevo(); } } }
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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. 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... #include <iostream> #include <string> using namespace std; const int MAXSTRINGS = 100; char transformar_caracter(char letra) { if ( letra%2 ) letra--; else letra++; return letra; } int main(int argc, char **argv ) { if(argc < 2) return 0; string frase[ MAXSTRINGS ]; int max = ( argc > MAXSTRINGS ) ? MAXSTRINGS : argc - 1; for(int it = 0; it < max; it++) { frase[it] = argv[ it + 1]; int tam = frase[it].size(); for(int i=0; i<tam; i++) cout << transformar_caracter(frase[it][i]); cout << "\t"; // Lo he puesto para separar cada palabra } cout << endl; return 0; }
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
Mensajes: 173
|
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. 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... #include <iostream> #include <string> using namespace std; const int MAXSTRINGS = 100; char transformar_caracter(char letra) { if ( letra%2 ) letra--; else letra++; return letra; } int main(int argc, char **argv ) { if(argc < 2) return 0; string frase[ MAXSTRINGS ]; int max = ( argc > MAXSTRINGS ) ? MAXSTRINGS : argc - 1; for(int it = 0; it < max; it++) { frase[it] = argv[ it + 1]; int tam = frase[it].size(); for(int i=0; i<tam; i++) cout << transformar_caracter(frase[it][i]); cout << "\t"; // Lo he puesto para separar cada palabra } cout << endl; return 0; }
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. int max = ( argc > MAXSTRINGS ) ? MAXSTRINGS : argc - 1;
Y luego no termino de entender, por qué el programa no explota si la idea de const int MAXSTRINGS = 100; string frase[ MAXSTRINGS ];
Es la misma idea qué: string frase[100];
|
|
|
En línea
|
Mi algoritmo en PHP (estupideces y más).while($Se_feliz){ Piensa_un_OBJETIVO(); // Sin excusas! if($Tienes_un_objetivo){ Suspira(); // Sé paciente. if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return; //RETURN; ¿O volvemos a empezar? }else{ Inténtalo_de_nuevo(); } } }
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
En principio no entiendo esta linea. int max = ( argc > MAXSTRINGS ) ? MAXSTRINGS : argc - 1;
Puesto de otra forma: int max; if ( argc > MAXSTRINGS ) max = MAXSTRINGS; else max = argc - 1;
Y luego no termino de entender, por qué el programa no explota si la idea de const int MAXSTRINGS = 100; string frase[ MAXSTRINGS ];
Es la misma idea qué: 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: 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
Mensajes: 1.639
|
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: 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: 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: #include <iostream> using std::cout; using std::endl; #include <string> using std::string; int main(int argc, char *argv[]) { if (argc > 1){ string linea = argv[1]; for (char **p = argv + 2; *p; p++) linea = linea + ' ' + *p; cout << linea << endl; } return 0; }
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
Mensajes: 173
|
Matarme por favor, lamento incordiar tanto. Ahora no entiendo esto: int max; if ( argc > MAXSTRINGS ) max = MAXSTRINGS; else 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: 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. 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).while($Se_feliz){ Piensa_un_OBJETIVO(); // Sin excusas! if($Tienes_un_objetivo){ Suspira(); // Sé paciente. if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return; //RETURN; ¿O volvemos a empezar? }else{ Inténtalo_de_nuevo(); } } }
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Pero no entiendo: 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
Mensajes: 173
|
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).while($Se_feliz){ Piensa_un_OBJETIVO(); // Sin excusas! if($Tienes_un_objetivo){ Suspira(); // Sé paciente. if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return; //RETURN; ¿O volvemos a empezar? }else{ Inténtalo_de_nuevo(); } } }
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
argumentos del main?
Programación C/C++
|
<<<-Basura->>>
|
4
|
6,133
|
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,068
|
14 Febrero 2012, 17:41 pm
por rir3760
|
|
|
Argumentos del main
Programación C/C++
|
mapers
|
5
|
3,589
|
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,794
|
3 Agosto 2012, 06:29 am
por xiruko
|
|
|
Duda sobre argumentos para main
Java
|
reygecko
|
2
|
2,417
|
21 Diciembre 2012, 08:21 am
por reygecko
|
|