sirve - que significa int main int argc char*argv[])
Argumentos a main en C (6)
Esta pregunta ya tiene una respuesta aquí:
¡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
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 <stdio.h>
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<argc; i++) printf("%d /t %s /n", i, argv[i]);
printf("/n");
return 0;
}
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
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 programa 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 programas que hagan algo más útil.
compilarlo (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 programa 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 programa cp entendiste los args principales realmente ...
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 programa 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.
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
Siamore, sigo viendo a todos usando la línea de comando para compilar programas. Utilizo el terminal x11 de ide a través de code :: blocks, un compilador gnu gcc en mi linux box. Nunca he compilado un programa desde la línea de comandos. Entonces, Siamore, si quiero que el nombre del programa 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 programa, ¿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 programació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 compilar 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 compilar 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 <stdio.h>
int main(int argc, char *argv[])
{
int i;
printf("The following arguments were passed to main(): ");
for(i=1; i<argc; i++) printf("%s ", argv[i]);
printf("/n");
return 0;
}
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 programa. Entonces si escribo ./CLA para ejecutar el programa ./CLA es argv [0]. El programa 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 resto 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 programa arriba, imprimiría la ruta / directorio del programa. Ejemplo: ~ / Documents / C / CLA.c tiene que ejecutarse desde el terminal y compilarse utilizando la línea de comando. gcc -o CLA main.c y debe estar en el directorio del archivo.
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 programa, invocado por el usuario. argv
contiene los argumentos reales, comenzando con el índice 1. El índice 0 es el nombre del programa.
Por lo tanto, si ejecutó su programa 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".