Problemas que pasan en un char[][] para execvp

Estoy tratando de recorrer algunos de entrada (que son los comandos y argumentos), dividir la entrada en cadenas individuales, pasar la entrada en execvp().

Estoy teniendo problemas como execvp() quiere un (char*, char*[]) como sus argumentos. Yo estoy pasando en (char*, char[][]) que yo pensaba que era la misma cosa, pero no le gustaba.

Me gustaría utilizar un char*[], pero no sé cómo de grande de las cuerdas antes de la ejecución, por lo que es la razón por la que no lo uso. Así que, obviamente, si puedo usar char*[], tengo un seg falla cuando intento acceder a los elementos de la char*'s.

He aquí un fragmento del código

//input
char *line = "echo hello there what is";
int count = 0;

//store arguments
char args[6][10];
int argCount = 0;

//store temp string from input
char temp[100];
int tempCount = 0;

//word(string) size
int wordSize = 0;

/*
 Here I iterate over the input, storing each string I find in args
 all the above variables help me do that.
 */

execvp(args[0], args);

printf("Error: It didnt work\n");

Con suerte, eso es claro y una pregunta válida, hágamelo saber si usted me quieren agregar el código de mí apagando la entrada en args.

2 Respuestas

  • chqrlie
    4 de mayo de 2019

    Una matriz de matrices de char no es el mismo como una matriz de punteros a arrays de char. execvp() espera que el último, con un puntero null como su último elemento, pasando el anterior tiene un comportamiento indefinido.

    Usted debe construir una matriz de indicadores, ya sea que se asignan desde el montón o definido con almacenamiento automático (en la pila), se inicializa con los punteros del argumento cadenas y pasar esta matriz execvp().

  • Some programmer dude
    4 de mayo de 2019

    Puede utilizar dos matrices:

    char real_args[6][10];  // Six strings of up to nine characters each
    ...
    char *args[] = {
        real_args[0],
        real_args[1],
        real_args[2],
        real_args[3],
        real_args[4],
        real_args[5],
        NULL  // Must be terminated by a null pointer
    };
    

    El uso de real_args para los argumentos reales y, a continuación, pasar args a execvp.