¿Cómo leer “cadena” del argumento de la línea de comando en C?

4 minutos de lectura

avatar de usuario de mike
Miguel

Tengo una pregunta sobre cómo pasar parámetros a través de la línea de comando.

Mi main() parece

int main(int argc, char **argv){
  int b, d, n, flag;  
  char *init_d, tst_dir[100];

  argv++;
  init_d=*(argv++);
  //printf(); <--------What do I have to do to init_d so that I can print it later?

Si argv es un puntero a una matriz de punteros que estoy asignando init_d para apuntar al valor al que apunta el puntero argv ¿puntos a? (Si eso tiene sentido)

Supongo que tengo que obtener ese valor en una matriz de caracteres para imprimirlo, pero si no sé el tamaño de la “cadena” que estoy pasando, no estoy seguro de cómo lograrlo. Por ejemplo, si ejecuto mi código ‘./myprogram hello’ en comparación con ‘./myprogram Alongerinput’

  • De acuerdo, gracias a todos. Me disculpo por mi estupidez. Seguía recibiendo fallas de segmentación, pero ahora veo por qué.

    – Miguel

    18 de febrero de 2011 a las 20:21

Avatar de usuario de David Heffernan
David Heffernan

Puede imprimir los argumentos sin transferirlos a matrices de caracteres. Son cadenas C terminadas en nulo y printf se los come en el desayuno:

for (i=0; i<argc; i++)
  printf("%s\n", argv[i]);  

  • Bueno, no quiero imprimir los argumentos de inmediato, necesito almacenar el valor pasado en una variable que quiero imprimir más tarde en una función.

    – Miguel

    18 de febrero de 2011 a las 20:17

  • @mike OK, guárdalos. El sistema operativo asigna el espacio para argv y dado que todo su programa está contenido dentro main y llámese lo que se llame, la memoria será válida mientras dure.

    –David Heffernan

    18 de febrero de 2011 a las 20:18


  • normalmente querríamos imprimir desde argv[1] en adelante como argv[0] es el nombre del programa si leí correctamente el libro de Kerrigan hace un momento.

    – mlestudiante33

    20 de diciembre de 2019 a las 0:48

Aquí hay un ejemplo que convierte los argumentos de la línea de comando en una sola cadena:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc < 1)
        return 0;

    int i;
    int strsize = 0;
    for (i=1; i<argc; i++) {
        strsize += strlen(argv[i]);
        if (argc > i+1)
            strsize++;
    }

    printf("strsize: %d\n", strsize);

    char *cmdstring;
    cmdstring = malloc(strsize);
    cmdstring[0] = '\0';

    for (i=1; i<argc; i++) {
        strcat(cmdstring, argv[i]);
        if (argc > i+1)
            strcat(cmdstring, " ");
    }

    printf("cmdstring: %s\n", cmdstring);

    return 0;
}

argv es un puntero a una matriz de cadenas terminadas en cero. No necesita saber el tamaño de la cadena; todo lo que necesita hacer es señalar el valor ya que el final de la cadena se indica con un ‘\0’.

char* init_d = argv[0];
printf("%s", init_d);

Si quisiera saber la longitud de la cadena, podría usar strlen(argv[0]).

Avatar de usuario de Cratylus
Crátilo

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

    while(--argc>0)
       printf("%s\n",*++argv);
    return 0;
}

argc: argument count i.e. number of arguments in command line
argv: argument vector 

si tu programa es myProg después myProg hello en la línea de comandos tiene argc=2 (incluido el nombre del programa), argv[0] es “myProg”, y argv[1] es “hola”

despues de correr

init_d = *(argv++);

(los paréntesis no son necesarios, por cierto), init_d es un puntero a un carácter. En C, una cadena es un puntero de carácter que se adhiere al contrato de que si se avanza lo suficiente, eventualmente se alcanzará un carácter nulo (‘\0’), lo que significa el final de la cadena. En otras palabras, init_d ahora es precisamente la cadena que desea. Puedes imprimirlo con

printf("%s", init_d);

Tenga en cuenta, por cierto, que *argv++ le proporciona el primer elemento de argv, que en realidad es el nombre de la función en la línea de comandos. Probablemente desee el primer argumento de la línea de comandos, que obtendrá con *++argv.

  • Te perdiste el suyo argv++; que ya omite el nombre del comando.

    –Jim Balter

    18 de febrero de 2011 a las 22:59

Avatar de usuario de Fox32
zorro32

Puede generar la cadena que apunta con init_d con

printf("%s", init_d);

“%s” genera todos los caracteres de la cadena hasta que llega a ‘\0’. En C, las cadenas terminan en nulo.

  • Te perdiste el suyo argv++; que ya omite el nombre del comando.

    –Jim Balter

    18 de febrero de 2011 a las 22:59

¿Ha sido útil esta solución?