He hecho un pequeño programa para calcular pi (π) como una integral. Ahora me enfrento a la pregunta de cómo extenderlo para calcular una integral, que se proporcionará como un parámetro adicional al iniciar una aplicación. ¿Cómo trato con tal parámetro en un programa?
Lectura de parámetros de línea de comando
punto de referencia
逆さま
Cuando escribe su función principal, normalmente ve una de dos definiciones:
int main(void)
int main(int argc, char **argv)
El segundo formulario le permitirá acceder a los argumentos de la línea de comandos pasados al programa y al número de argumentos especificados (los argumentos están separados por espacios).
Los argumentos a main
son:
int argc
– el número de argumentos pasados a su programa cuando se ejecutó. es al menos1
.char **argv
– esto es un puntero a-char *
. Alternativamente puede ser esto:char *argv[]
que significa ‘conjunto dechar *
‘. Esta es una matriz de punteros de cadena de estilo C.
Ejemplo básico
Por ejemplo, podría hacer esto para imprimir los argumentos pasados a su programa C:
#include <stdio.h>
int main(int argc, char **argv)
{
for (int i = 0; i < argc; ++i)
{
printf("argv[%d]: %s\n", i, argv[i]);
}
}
Estoy usando GCC 4.5 para compilar un archivo que llamé args.c
. Compilará y creará un valor predeterminado a.out
ejecutable.
[birryree@lilun c_code]$ gcc -std=c99 args.c
Ahora ejecútalo…
[birryree@lilun c_code]$ ./a.out hello there
argv[0]: ./a.out
argv[1]: hello
argv[2]: there
Entonces puedes ver eso en argv
, argv[0]
es el nombre del programa que ejecutó (este no es un comportamiento definido por estándares, pero es común. Sus argumentos comienzan en argv[1]
y más allá.
Básicamente, si quisieras un solo parámetro, podrías decir…
./myprogram integral
Un caso simple para usted
Y podrías comprobar si argv[1]
era integral
tal vez como strcmp("integral", argv[1]) == 0
.
Así que en tu código…
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
if (argc < 2) // no arguments were passed
{
// do something
}
if (strcmp("integral", argv[1]) == 0)
{
runIntegral(...); //or something
}
else
{
// do something else.
}
}
Mejor análisis de línea de comandos
Por supuesto, todo esto era muy rudimentario y, a medida que su programa se vuelve más complejo, probablemente querrá un manejo de línea de comandos más avanzado. Para eso, podrías usar una biblioteca como ÑU getopt
.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int i, parameter = 0;
if (argc >= 2) {
/* there is 1 parameter (or more) in the command line used */
/* argv[0] may point to the program name */
/* argv[1] points to the 1st parameter */
/* argv[argc] is NULL */
parameter = atoi(argv[1]); /* better to use strtol */
if (parameter > 0) {
for (i = 0; i < parameter; i++) printf("%d ", i);
} else {
fprintf(stderr, "Please use a positive integer.\n");
}
}
return 0;
}
Validus Óculo
Analizar los argumentos de la línea de comando de una manera primitiva, como se explica en las respuestas anteriores, es razonable siempre que la cantidad de parámetros con los que debe lidiar no sea demasiado.
Le sugiero encarecidamente que utilice una biblioteca de fuerza industrial para manejar los argumentos de la línea de comandos.
Esto hará que su código sea más profesional.
Dicha biblioteca para C++ está disponible en el siguiente sitio web. He usado esta biblioteca en muchos de mis proyectos, por lo tanto, puedo decir con confianza que esta es una de las bibliotecas más fáciles pero útiles para el análisis de argumentos de línea de comandos. Además, dado que es solo una biblioteca de plantillas, es más fácil importarla a su proyecto.
http://tclap.sourceforge.net/
Una biblioteca similar también está disponible para C.
http://argtable.sourceforge.net/
AndreDurao
También hay una biblioteca integrada estándar C para obtener argumentos de línea de comandos: getopt
Usted puede comprobarlo en Wikipedia o en Asistentes de análisis de argumentos para C/Unix.
Entonces, ¿su pregunta es realmente solo sobre argumentos de línea de comando?
– 逆さま
1 de marzo de 2011 a las 16:33
sí, y luego no sé cómo manejarlo en el programa real, si lo leo como un carácter, ¿entonces lo transfiero a int para computar? Solo que esta es la parte que no entiendo
– Punto de referencia
1 de marzo de 2011 a las 16:35
pubs.opengroup.org/onlinepubs/009695399/functions/getopt.html
– Zimbabue
1 de marzo de 2011 a las 16:40
(Título editado para hacerlo más apropiado)
– óculo
1 de marzo de 2011 a las 16:51