Argumentos a main en C

¡No se que hacer! Tengo una gran comprensión de C básicos. Estructuras, archivo IO, cadenas, etc. Todo menos CLA. Por alguna razón, no puedo captar el concepto. Cualquier sugerencia, ayuda o consejo. PD: soy un usuario de Linux

La firma de main es:

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

argc refiere a la cantidad de argumentos de línea de comando pasados, que incluye el nombre real del progtwig, invocado por el usuario. argv contiene los argumentos reales, comenzando con el índice 1. El índice 0 es el nombre del progtwig.

Por lo tanto, si ejecutó su progtwig de esta manera:

 ./program hello world 

Entonces:

  • argc sería 3.
  • argv [0] sería “./program”.
  • argv [1] sería “hola”.
  • argv [2] sería “mundo”.

Para analizar los argumentos de la línea de comando en los sistemas posix, el estándar es usar la familia de rutinas de biblioteca getopt() para manejar los argumentos de línea de comando.

Una buena referencia es el manual de GNU getopt

Imagínate de esta manera

 *main() is also a function which is called by something else (like another FunctioN) *the arguments to it is decided by the FunctioN *the second argument is an array of strings *the first argument is a number representing the number of strings *do something with the strings 

Quizás un progtwig de ejemplo ayudaría.

 int main(int argc,char *argv[]) { printf("you entered in reverse order:\n"); while(argc--) { printf("%s\n",argv[argc]); } return 0; } 

simplemente imprime todo lo que ingresa como args en orden inverso, pero USTED debe hacer nuevos progtwigs que hagan algo más útil.

comstackrlo (como decir hola) ejecutarlo desde la terminal con los argumentos como

 ./hello am i here 

luego intente modificarlo para que intente verificar si dos cadenas se invierten o no, entonces deberá verificar si el parámetro argc es exactamente tres si algo más imprime un error.

 if(argc!=3)/*3 because even the executables name string is on argc*/ { printf("unexpected number of arguments\n"); return -1; } 

luego verifique si argv [2] es el reverso de argv [1] e imprima el resultado

 ./hello asdf fdsa 

debería salir

 they are exact reverses of each other 

el mejor ejemplo es un progtwig de copia de archivo pruébalo es como cp

archivo cp archivo1

cp es el primer argumento (argv [0] not argv [1]) y sobre todo debes ignorar el primer argumento a menos que necesites hacer referencia o algo

si hiciste el progtwig cp entendiste los args principales realmente …

Siamore, sigo viendo a todos usando la línea de comando para comstackr progtwigs. Utilizo el terminal x11 de ide a través de code :: blocks, un comstackdor gnu gcc en mi linux box. Nunca he comstackdo un progtwig desde la línea de comandos. Entonces, Siamore, si quiero que el nombre del progtwig sea cp, ¿inicializo argv [0] = “cp”; Cp es una cadena literal. Y todo lo que va a stdout va en la línea de comando ??? ¡El ejemplo que me diste Siamore lo entendí! Aunque la cadena que ingresó tenía pocas palabras, todavía era una sola arg. Porque estaba encerrado en dobles citas. Entonces arg [0], el nombre del progtwig, ¿es en realidad tu cadena literal con un nuevo carácter de línea? Entonces entiendo por qué usa if (argc! = 3) error de impresión. Porque el nombre de progtwigción = argv [0] y hay 2 argumentos más después de eso, y ya se ha producido un error. ¿Qué otra razón usaría eso? Realmente creo que mi falta de comprensión acerca de cómo comstackr desde la línea de comandos o terminal es mi razón para la falta de comprensión en esta área. Siamore, ¡me has ayudado a comprender mejor a cla! Todavía no entiendo completamente, pero no soy ajeno al concepto. Aprenderé a comstackr desde la terminal y volveré a leer lo que escribiste. ¡Apuesto, entonces lo entenderé completamente! Con un poco más de ayuda de ti lol

<> Código que no he escrito yo mismo, pero de mi libro.

 #include  int main(int argc, char *argv[]) { int i; printf("The following arguments were passed to main(): "); for(i=1; i 

Este es el resultado:

 anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hey man The follow arguments were passed to main(): hey man anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hi how are you doing? The follow arguments were passed to main(): hi how are you doing? 

Entonces argv es una tabla de literales de cadena, y argc es el número de ellos. Ahora argv [0] es el nombre del progtwig. Entonces si escribo ./CLA para ejecutar el progtwig ./CLA es argv [0]. El progtwig anterior establece la línea de comando para tomar una cantidad infinita de argumentos. Puedo configurarlos para que solo tomen 3 o 4 si quisiera. Al igual que uno o sus ejemplos mostraron, Siamore ... if (argc! = 3) printf ("Algunos errores van aquí"); Gracias Siamore, ¡no podría haberlo hecho sin ti! ¡Gracias al rest de la publicación por su tiempo y esfuerzo también!

PD en caso de que haya un problema como este en el futuro ... nunca se sabe si el problema fue porque estaba usando IDE AKA Code :: Blocks. Si fuera a ejecutar ese progtwig arriba, imprimiría la ruta / directorio del progtwig. Ejemplo: ~ / Documents / C / CLA.c tiene que ejecutarse desde el terminal y comstackrse utilizando la línea de comando. gcc -o CLA main.c y debe estar en el directorio del archivo.

Main es como cualquier otra función y argc y argv son como cualquier otro argumento de función, la diferencia es que main se llama desde C Runtime y pasa el argumento a main, pero C Runtime se define en c library y no se puede modificar Entonces, si ejecutamos el progtwig en shell o mediante un IDE, necesitamos un mecanismo para pasar el argumento a la función principal, de modo que su función principal se comporte de manera diferente en el tiempo de ejecución según sus parámetros. Los parámetros son argc, que da el número de argumentos y argv que es puntero a una matriz de punteros, que mantiene el valor como cadenas, de esta manera puede pasar cualquier cantidad de argumentos sin restringirlo, es la otra forma de implementar var args.

Había hecho solo un pequeño cambio en el código @anthony para que podamos obtener un buen resultado con los números y valores de los argumentos. De alguna manera es más fácil de leer en la salida cuando tiene múltiples argumentos:

 #include  int main(int argc, char *argv[]) { printf("The following arguments were passed to main():\n"); printf("argnum \t value \n"); for (int i = 0; i 

Y la salida es similar a:

 The following arguments were passed to main(): 0 D:\Projects\test\vcpp\bcppcomp1\Debug\bcppcomp.exe 1 -P 2 TestHostAttoshiba 3 _http._tcp 4 local 5 80 6 MyNewArgument 7 200.124.211.235 8 type=NewHost 9 test=yes 10 result=output