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’
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 dentromain
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 comoargv[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])
.
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
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
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