Foros del Web » Programación para mayores de 30 ;) » Programación General »

Parámetros desde línea de comando en C

Estas en el tema de Parámetros desde línea de comando en C en el foro de Programación General en Foros del Web. :séveR led onieR le edsed sodulaS ... pués heme aquí de nuevo... con una duda de la cuál estoy en cero ... he intentado buscar ...
  #1 (permalink)  
Antiguo 03/06/2005, 19:41
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Parámetros desde línea de comando en C

:séveR led onieR le edsed sodulaS

... pués heme aquí de nuevo... con una duda de la cuál estoy en cero ... he intentado buscar en este foro pero solo veo resultados en Visual Basic (y que por tanto no he leido aprofundidad)...

Pués bien, la cuestión es que quisiera saber cómo recibir parámetros desde la línea de comandos (C:\>)... osease, yo debo crear mi programa.exe y ejecutarlo desde el promt así:
C:\>programa.exe -v archivo.txt
y, por ejemplo.. debe mostrarme el contenido de archivo.txt ... obviamente los parámetros serám varios y harán diferentes cosas... pero ni idea de como recibirlos .

Gracias de antemano.
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #2 (permalink)  
Antiguo 04/06/2005, 01:49
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
La Run Time Library de C lo hace automaticamente declarando el main de esta manera:

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

argc representa la cantidad de parametros y argv es un array de cadenas al que se accede simplemente con el indice (argv[2] por ejemplo).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 04/06/2005, 10:46
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Si, pero el argc contiene el numero de argumentos contando desde uno por ejemplo:

programa.exe -arg1 arg2.xx

te dara 2 en argc, el primero es el nombre y direccion del programa, el segundo es el primer argumento y el tercero es el segundo argumento.

En argv es un poco diferente.

argv[0] contiene el nombre del programa
argv[1]contiene el primer argumento
argv[2] contiene el segundo argumento.

Mas o menos estu funciona asi..

Otra cosa, para que no tengas problemas con el codigo que puse, usa esta funcion main:

void main(int argc, char *argv[])

A diferencia a la de eternal idol es que yo lo pongo como puntero a array y el como doble puntero char.

Supuestamente es lo mismo, pero pues nunca lo he probado y por lo tanto no confio mucho en eso.

Saludos
  #4 (permalink)  
Antiguo 04/06/2005, 10:53
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
¿Si no lo probaste nunca y no entendes como funcionan los punteros y los arrays porque desconfias? Seria tanto mas facil comprobar que funciona perfectamente ...

Proba con esta y me contas que tal:
void main(int numeroDeArgumentosMasUno, char **argumentos)

PD. ¿Si pero que? Yo no hable de como estaban estructurados los argumentos en argv ya que probando cualquiera lo veria.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 04/06/2005, 16:30
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Instru
Si, pero el argc contiene el numero de argumentos contando desde uno por ejemplo:

programa.exe -arg1 arg2.xx

te dara 2 en argc, el primero es el nombre y direccion del programa, el segundo es el primer argumento y el tercero es el segundo argumento.

En argv es un poco diferente.

argv[0] contiene el nombre del programa
argv[1]contiene el primer argumento
argv[2] contiene el segundo argumento.

Mas o menos estu funciona asi..

Otra cosa, para que no tengas problemas con el codigo que puse, usa esta funcion main:

void main(int argc, char *argv[])

A diferencia a la de eternal idol es que yo lo pongo como puntero a array y el como doble puntero char.

Supuestamente es lo mismo, pero pues nunca lo he probado y por lo tanto no confio mucho en eso.

Saludos
Ciertamente, la nomenglatura argc y argv es simplemente una, puedes usar lo que te de la gana, y a propósito, [] es lo mismo que *... En mi caso casi siempre prefiero los punteros antes que los arrays, salvo excepciones que convengan.
  #6 (permalink)  
Antiguo 06/06/2005, 23:20
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Gracias a todos por sus aportes... los leeré con calma y haré pruebas... la verdad es que no tenía ni idea de cómo se hacia esto , pero ahora, al menos con la idea podré avanzar de mejor manera... ojalá tenga suerte .

Cualquier duda que se me atravieze vuelvo a postear, mientras tanto, mil gracias.
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #7 (permalink)  
Antiguo 07/06/2005, 06:02
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por jam1138
Gracias a todos por sus aportes... los leeré con calma y haré pruebas... la verdad es que no tenía ni idea de cómo se hacia esto , pero ahora, al menos con la idea podré avanzar de mejor manera... ojalá tenga suerte .

Cualquier duda que se me atravieze vuelvo a postear, mientras tanto, mil gracias.
De nada
  #8 (permalink)  
Antiguo 07/06/2005, 08:02
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Cita:
¿Si no lo probaste nunca y no entendes como funcionan los punteros y los arrays porque desconfias? Seria tanto mas facil comprobar que funciona perfectamente ...
MMMM.......oye, que sea un poco malo con los punteros no quiere decir que no sepa...... aparte lo del argv pues lo aprendi asi y siempre me funciono asi, por eso desconfie de la otra manera. Aparte, en mi caso, el codigo es mas facil asi, con arrays.
Pero bueno, por lo menos ya se que si es posible manejar de manera diferente los argumentos....

Bueno, Eternal Idol, gracias por la aclaraciony cuidado con esos prejuicios...

Saludos
  #9 (permalink)  
Antiguo 07/06/2005, 09:23
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cita:
Iniciado por Instru
MMMM.......oye, que sea un poco malo con los punteros no quiere decir que no sepa...... aparte lo del argv pues lo aprendi asi y siempre me funciono asi, por eso desconfie de la otra manera. Aparte, en mi caso, el codigo es mas facil asi, con arrays.
Pero bueno, por lo menos ya se que si es posible manejar de manera diferente los argumentos....

Bueno, Eternal Idol, gracias por la aclaraciony cuidado con esos prejuicios...

Saludos
Yo no dije que fueras malo con los punteros o que no los 'sepas', lo dijiste vos en algun que otro post, dije que es ridiculo que le digas a alguien que use otra forma porque desconfies de la mia en vez de probarlo y de esto se desprende sin lugar a duda que el que tiene prejuicios sos vos, en vez de probar simplemente desconfias.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #10 (permalink)  
Antiguo 07/06/2005, 10:23
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Instru
Aparte, en mi caso, el codigo es mas facil asi, con arrays.
Es que un array y un puntero es lo mismo en el uso. La única diferencia es la declaración y cómo se compila, se puede decir que en C son lo mismo... Decir ** que decir *[] es lo mismo...
  #11 (permalink)  
Antiguo 07/06/2005, 10:30
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Ok, si entiendo que el primer elemento del array es donde apunta el puntero, pero me refiero que hay persionas que se les dificultan un poco los punteros como a mi y pues prefieren usar arrays aunque en cierta forma sea lo mismo, que sin embargo no lo es.

Espero haber aclarado...
Tambien Eternal Idol, desconfie de eso por lo mismo, porque no domino al 100% los punteros ya que nunca he necesitado de cosas muy compleja con estos. No es que tu codigo este mal o no me guste, simplemente porque lo entiendo mejor con arrays.

Espero haberme explicdo bien.

Saludos
  #12 (permalink)  
Antiguo 07/06/2005, 10:34
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Instru
Ok, si entiendo que el primer elemento del array es donde apunta el puntero, pero me refiero que hay persionas que se les dificultan un poco los punteros como a mi y pues prefieren usar arrays aunque en cierta forma sea lo mismo, que sin embargo no lo es.

Espero haber aclarado...
Tambien Eternal Idol, desconfie de eso por lo mismo, porque no domino al 100% los punteros ya que nunca he necesitado de cosas muy compleja con estos. No es que tu codigo este mal o no me guste, simplemente porque lo entiendo mejor con arrays.
Repito, un array y un puntero es lo _mismo_, y si no dime explícame eso de "sin embargo no lo es". La única diferencia, repito, es la declaración y compilación. Y la declaración se elige la de puntero o la de array según convenga. El uso, el mismo.

Si hablásemos de ASM en el cual sumar a una dirección no tiene nada que ver el tamaño, bien, pero como C tiene aritmética de punteros, es igual que un array. Decir tal[5] a decir *(tal+5) es equivalente.
  #13 (permalink)  
Antiguo 14/06/2005, 18:48
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Volvemos :
.. si estoy declarando a argv como char ¿por qué no puedo compararlo como tal???

Con un if...
Código:
main(int argc, char **argv) {
      if(argv[1]=="-v") ....
}
no me lo reconoce... y con un switch (que es lo que quisiera)...
Código:
main(int argc, char **argv) {
      switch(argv[1]) {
            case "-v": ....
      }
}
me aparece el error: Switch selection expression must be of integral type ... ¿? ¿por qué?, ¿por qué? ¿por qué? .... me quedé >>> con esto :-p.

Trabajo con Turbo C++ v3.0 (pero trabajo en C puro), bajo Windows XP.

Gracias de antemano...
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"

Última edición por jam1138; 15/06/2005 a las 00:35
  #14 (permalink)  
Antiguo 14/06/2005, 18:58
Avatar de SiR.CARAJ0DIDA  
Fecha de Ingreso: junio-2004
Ubicación: Acá
Mensajes: 1.166
Antigüedad: 19 años, 10 meses
Puntos: 4
que es el parametro "-v" ?? los parameros se mandan a continuacion del nombre del ejecutable?? asi por ej:

c:\programita.exe param1 param2 param3 param4

?
  #15 (permalink)  
Antiguo 14/06/2005, 19:34
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
En efecto... sigo con el mismo planteamiento original... yo tendría que teclear algo como C:\>programa.exe -v archivo.txt donde "-v" me dirá que hacer con "archivo.txt" (buscar, desplegarlo, contar líneas, concatenar... etc.. cuestión aparte) y obviamente variarán dichos parámetros... pero no el orden (programa -c algo, programa -h, programa -f algo otro_algo, etc..) entonces primeramente tengo que ver el valor de argv[1] para actuar... de ahí hacer otro tipo de validaciones si es necesario con las posteriores posiciones de argv... por ejemplo la existencia de archivo.txt (access())... y demás...

Saludos!
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #16 (permalink)  
Antiguo 14/06/2005, 20:14
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
porque te falto ponerle el char antes del **argv(argv[])
  #17 (permalink)  
Antiguo 14/06/2005, 20:17
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
A por cierto, se me olvido decirte que el switch es solo para numeros, no puedes usar algo como

case "xxx":

Eso no funciona y esta mal, lo he probado y no me compila siquiera.

saludos
  #18 (permalink)  
Antiguo 15/06/2005, 00:33
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Cita:
Iniciado por Instru
porque te falto ponerle el char antes del **argv(argv[])
... lo siento fue error de teclazo al escribir aquí... aunque iba implícito en mis palabras:
Cita:
Iniciado por jam1138
.. si estoy declarando a argv como char ¿por qué no puedo compararlo como tal???
... respecto a lo del switch()... pués lo curioso es que en los ejemplos que he encontrado sí lo hacen así... en la misma documentación del programa viene... ... pero de ser así, la pregunta sigue siendo ¿por qué???

Gracias por la observación... edito para corregir...
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #19 (permalink)  
Antiguo 15/06/2005, 08:58
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
MMM que raro. Mira te voy a decir porque esta mal.

Porque tu al traducir esos cases a if-else te saldria algo como:

else if(argv[1]=="hola")

Cosa que esta terriblemente mal. Y pues como los switch case son otra manera de representar los if-esle pues ahi esta una comprobacion, lo ideal sera:

else if(strcmp(argv[1], "hola")==0)

Y esto si es correcxto mas no se puede implementar como switch-case porque cada situacion es diferente.

Ahora, como argv[1]es un puntero como dice maxextreme entonces no puede contener namas -v para eso debes usar el strcmp tambien, ese era tu error, intenta usar el strcmp que es para comparar cadenas, y regresa 0 si son iguales. Por cierto, no uses algo como:

if(strcmp(argv[1], "hola")) asi solo porque strcmp puede regresar valores positivos aunque las cadenas sean differentes, usa strcmp(argv[1], "-v")==0.


Saludos
  #20 (permalink)  
Antiguo 15/06/2005, 09:22
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Instru
Otra cosa, para que no tengas problemas con el codigo que puse, usa esta funcion main:

void main(int argc, char *argv[])
Ahora que me fijo, eso no es la declaración estándar ;) es int main, no void...
  #21 (permalink)  
Antiguo 15/06/2005, 09:26
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Vaya rollo os traéis.

Simplemente, una cadena es un puntero a su primer byte. Y como tal, si haces

argv[1]=="tal" estás comparando la dirección del puntero argv[1] con el puntero a la cadena "tal".

Y además, en un switch _siempre_ se tiene que poner un número como te dice el mismo compilador (al menos en C/C++, mira a ver dónde te enseñan...)...
  #22 (permalink)  
Antiguo 17/06/2005, 02:21
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Cita:
Iniciado por MaxExtreme
Ahora que me fijo, eso no es la declaración estándar ;) es int main, no void...
... ... y por curiosidad.. si yo no voy a regresar algún valor (alguna función main puede??) ¿en qué me afectaría ponerlo como void? ...

Cita:
Iniciado por MaxExtreme
Y además, en un switch _siempre_ se tiene que poner un número como te dice el mismo compilador
.. lo siento... me confundí ... mencioné en la misma documentación del compilador manejaban cadenas... pero leyendo bien no son cadenas, son constantes .. solo ví que había letras... pero bueno, entonces se aplican con números y constantes... anotado está...

Agradesco la ayuda (gracias Instru), mi problema lo solucioné con la función strcmp() y con if -> else ..... hasta la próxima!
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #23 (permalink)  
Antiguo 17/06/2005, 03:24
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
A ver, vamos a aclarar un poco. Siempre se devuelve un valor, SIEMPRE, ya que los valores se devuelven utilizando un registro (eax en 32 bits) con lo cual por mas que no lo modifiquemos (cosa bastante rara) y no usemos return la funcion llamadora puede interpretar nuestro valor de retorno con el contenido de este registro.

En general no pasa nada por declarar el tipo de retorno de main como void.

Tal vez esto le sirva a alguien:
http://www.solocodigo.com/index.php?...&type=4&node=1
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #24 (permalink)  
Antiguo 19/06/2005, 16:00
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Cita:
Agradesco la ayuda (gracias Instru), mi problema lo solucioné con la función strcmp() y con if -> else
De nada.

Cualquier duda la pones.
Y main puede devolver cualquier valir, solo que lo mas recomendable es int para saber con que codigo de error salio el programa(algo por lo que en realidad no te debes preocupar ni romper la cabeza sabiendo que significa)

Saludos
  #25 (permalink)  
Antiguo 20/06/2005, 08:42
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Instru
De nada.

Cualquier duda la pones.
Y main puede devolver cualquier valir, solo que lo mas recomendable es int para saber con que codigo de error salio el programa(algo por lo que en realidad no te debes preocupar ni romper la cabeza sabiendo que significa)

Saludos
No, la declaración main debe ser "int" porque es el estándar. Por otra parte, eso de que "el sistema sepa si ha salido bien o mal" depende del sistema, normalmente no sirve para nada, pero si quieres que el programa _sea estándar_, y por lo tanto compilable en cualquier lado, debe ser int. Por otra parte, si estás ejecutando procesos o aplicaciones, cuando te devuelvan un valor, tendrá que ser algo un int, no "void". Y como punto final, un int puede representar un puntero (4 bytes int = 4 bytes puntero), y a veces es útil.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 09:17.