2011-02-18 8 views
7

Tengo una pregunta sobre cómo pasar los parámetros a través de la línea de comando.¿Cómo leer "cadena" del argumento de la línea de comando en C?

Mis main() se parece a

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 que apunte al valor que se está apuntado por el puntero argv puntos a? (Si eso incluso 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 "cuerda" que estoy pasando, estoy no estoy seguro de cómo lograr esto. Por ejemplo, si ejecuto mi código './myprogram hello' en comparación con './myprogram alongerinput'

+0

Está bien gracias a todo el mundo me disculpo por mi torpeza me hacía cada vez fallos de segmentación pero veo por qué ahora. – mike

+1

C es un maestro cruel! –

Respuesta

12

Puede imprimir los argumentos sin transferirlos a matrices de caracteres. Son cadenas de terminación nula C y printf los come para el desayuno:

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

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

+0

@mike OK, guárdelos.El sistema operativo asigna el espacio para 'argv' y dado que todo su programa está contenido dentro de' main' y lo que sea que llame, la memoria será válida por la duración. –

2
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 su programa es myProg continuación myProg hello en línea de comandos ha argc = 2 (incluyendo el nombre del programa), argv [0] es " mYPROG", y argv [1] es "hola"

0

puede dar salida a la cadena que señala con init_d en con

printf("%s", init_d); 

"" salida% s todos los caracteres del cuerda hasta llegar a '\ 0'. En C, las cadenas tienen terminación nula.

2

Después de ejecutar

init_d = *(argv++); 

(parens no es necesario, 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 que, si 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 deseas. Puede imprimir con

printf("%s", init_d); 

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

+0

Has perdido su 'argv ++;' que ya omite el nombre del comando. –

1

argv es un puntero a una matriz de cadenas terminadas en nulo. 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 quería saber la longitud de la cadena que podría utilizar strlen(argv[0]).

3

Aquí es ejemplo que convierte los argumentos de línea de comando para 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; 
} 
Cuestiones relacionadas