Lectura de parámetros de línea de comando

4 minutos de lectura

avatar de usuario
punto de referencia

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?

  • 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

avatar de usuario
逆さま

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 menos 1.
  • char **argv – esto es un puntero a-char *. Alternativamente puede ser esto: char *argv[]que significa ‘conjunto de char *‘. 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 integraltal 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;
}

avatar de usuario
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/

avatar de usuario
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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad