2016-04-16 6 views
0

Ich habe einen String-Vektor vector<string> args, den ich in eine c-Zeichenfolge konvertieren muss, um wiederum als Argumente durch einen execvp-Aufruf zu laufen. Ich bekomme den Fehler "ungültige Konvertierung von const Char * zu char * für die Zeile in meiner Schleife. Ich verstehe nicht, wie dies zu beheben, während immer noch etwas, was ich execvp füttern kann. Während ich ähnliche Beiträge gesehen haben, keine der Lösungen scheinen ich gekommen bin über mein Problem zu beheben.Falsche Typen, bei denen ein Vektor in execvp konvertiert wird

int argsLen = c->args.size(); 
    char **argv = new char* [c->args.size() + 1]; 
    for (int index = 0; index < c->args.size(); ++index) 
     argv[index] = c->args[index].c_str();//note that c is the structure in which args is contained 
    argv[c->args.size() + 1] = NULL; 

    //execvp(argv[0], argv); 

Antwort

1

c_str() gibt einen const char Zeiger auf seinen internen Puffer, dessen Inhalt Sie nicht erlaubt zu ändern sind (das ist, warum seine const) und offensichtlich nicht zuordnen kann . Ihre char buffer Sie müssen für jeden String Speicher zuzuweisen, und kopieren Sie sie:

argv[index] = new char[c->args[index].length()]; 
strcpy(argv[index], c->args[index].c_str()); 

umfassen cstring Header für Strcpy.

+0

dies funktioniert. Vielen Dank! – minusila

+0

Wie werden Sie in nicht zugewiesenen Speicherplatz "strcpy"? Wenn ich nichts sehe, sieht das so aus, als würde ein Speicher überschrieben. – PaulMcKenzie

+0

@PaulMcKenzie: Sie sehen tatsächlich etwas, das ich nicht tat, bearbeitet, thx. – Unimportant

0

Vielleicht kann dies helfen:

char const **argv = new const char* [c->args.size() + 1];

+0

Dies würde die Zuweisung funktionieren, aber die Zeichenfolgen können später ändern, ändern oder sogar ihre internen Puffer verschieben, die kopierten Zeiger ungültig machen. – Unimportant

2

Wenn Sie dies ohne die Möglichkeit zu tun, wollen Speicher oder Speicherüberschreibung von undichten Sie folgendes tun:

typedef std::vector<char> CharArray; 
typedef std::vector<CharArray> ArgumentVector; 
//... 
ArgumentVector argVec; 
std::vector<char *>argv; 
for (int index = 0; index < c->args.size(); ++index) 
{ 
    // get the command and create copy 
    argVec.push_back(CharArray(c->args[index].begin(), c->args[index].end())); 

    // get pointer to newly created entity and place in argv vector 
    argV.push_back(argVec.back().data()); 
} 

// the last argument is NULL 
argV.push_back(NULL); 

execvp(argV[0], // the first item in the array 
     argV.data(), // the char** we are sending 

Alles, was wir taten war ein std::vector<char*> erstellen, und die Art, wie wir die Zeiger in diesem Vektor setzen, ist, auf Daten von einem anderen Vektor zu zeigen. Sobald die std::vector<char*> aufgefüllt ist, dann ist char** nur ein Zeiger auf das erste Element.

BTW, dies ist einer der legitimen Gründe, eine vector<char *> im Gegensatz zu einer vector<string> zu verwenden. In den meisten anderen Fällen verwenden Sie vector<string>, wenn Sie einen Vektor von Zeichenfolgen möchten.