Probleme die übergabe eines char [] [], um execvp

Ich bin versucht zu iterieren über eine Eingabe (das sind die Befehle und Argumente), teilen Sie die Eingaben in den einzelnen Saiten, dann pass, der Eingang in execvp().

Ich habe Schwierigkeiten, als execvp() will a (char*, char*[]) als Argumente. Ich leite in (char*, char[][]) ich dachte, das war die gleiche Sache, aber es nicht zu mögen.

Ich würde ein char*[] aber ich weiß nicht, wie groß die strings sind, bevor es läuft, so, dass ist der Grund, warum ich es nicht verwenden. So offensichtlich, wenn ich mit char*[], bekomme ich einen seg fault, wenn ich versuche, Zugriff auf Elemente der char*'s.

Hier ist ein Ausschnitt des Codes

//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");

Hoffentlich, das ist klar und eine gültige Frage, lassen Sie mich wissen, wenn Sie wollen, mich zu fügen Sie den code von mir drehen die Eingabe in args.

2 Antworten

  • chqrlie
    4. Mai 2019

    Ein array von arrays von char ist nicht das gleiche wie ein array von Zeigern auf arrays von char. execvp() erwartet, dass die letzteren, mit einem null-Zeiger als letzten element, vorbei an der ehemaligen hat nicht definiertes Verhalten.

    Erstellen Sie ein array von Zeigern, die entweder reserviert auf dem heap oder definiert mit automatischer Speicherung (auf dem stack), initialisieren Sie ihn mit dem Zeiger auf argument-strings und übergibt dieses array an execvp().

  • Some programmer dude
    4. Mai 2019

    Sie können verwenden zwei arrays:

    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
    };
    

    Verwenden Sie real_args für die tatsächlichen Argumente, und dann gehen args zu execvp.