So übergeben Sie einen Vektor an execvp

Lesezeit: 3 Minuten

Ich möchte einen Vektor als zweites Argument an execvp übergeben. Ist es möglich?

  • Siehe stackoverflow.com/questions/5797837/…

    – kiw

    1. Mai 2011 um 6:58 Uhr

  • Mögliches Duplikat von How to pass a vector of strings to execv

    – Ciro Santilli Путлер Капут 六四事

    21. Oktober 2019 um 16:13 Uhr

Benutzer-Avatar
Dillon Kearns

Ja, es kann ziemlich sauber gemacht werden, indem man sich das interne Array zunutze macht, das Vektoren verwenden.

Dies funktioniert, da der Standard garantiert, dass seine Elemente zusammenhängend gespeichert werden (siehe https://stackoverflow.com/a/2923290/383983).

#include <vector>

using namespace std;

int main(void) {
  vector<char *> commandVector;

  // do a push_back for the command, then each of the arguments
  commandVector.push_back("echo");
  commandVector.push_back("testing");
  commandVector.push_back("1");
  commandVector.push_back("2");
  commandVector.push_back("3");  

  // push NULL to the end of the vector (execvp expects NULL as last element)
  commandVector.push_back(NULL);

  // pass the vector's internal array to execvp
  char **command = &commandVector[0];

  int status = execvp(command[0], command);
  return 0;
}

  • Seit C++11 können Sie auch std::vector::data() verwenden, um das interne Array zu erhalten.

    – hgiesel

    18. März 2016 um 16:16 Uhr


  • Irgendwelche Vorschläge zur Handhabung deprecated conversion from string constant to ‘std::vector<char*>::value_type {aka char*}’ [-Wwrite-strings] Warnungen für das Verschieben von Zeichenfolgenkonstanten auf commandVector?

    – mpr

    31. August 2017 um 14:34 Uhr


  • Ja, dies ist einer dieser Fälle in C++, in denen Sie einen const_cast verwenden oder Ihren Code wirklich komplizieren müssen (kopieren Sie all diese Werte in char*-Variablen, es lohnt sich nicht wirklich).

    – Ericcurtin

    8. Dezember 2017 um 12:32 Uhr

Benutzer-Avatar
Ericcurtin

Ja, es kann ziemlich sauber gemacht werden, indem man sich das interne Array zunutze macht, das Vektoren verwenden.

Dies funktioniert, da der Standard garantiert, dass seine Elemente zusammenhängend gespeichert werden (siehe https://stackoverflow.com/a/2923290/383983).

#include <vector>

using std::vector;

int main() {
  vector<char*> commandVector;

  // do a push_back for the command, then each of the arguments
  commandVector.push_back(const_cast<char*>("echo"));
  commandVector.push_back(const_cast<char*>("testing"));
  commandVector.push_back(const_cast<char*>("1"));
  commandVector.push_back(const_cast<char*>("2"));
  commandVector.push_back(const_cast<char*>("3"));

  // push NULL to the end of the vector (execvp expects NULL as last element)
  commandVector.push_back(NULL);

  int status = execvp(command[0], &command[0]);
  return 0;
}

Führen Sie einen const_cast durch, um die “veraltete Konvertierung von der Zeichenfolgenkonstante in ‘char*'” zu vermeiden. String-Literale werden in C++ als ‘const char*’ implementiert. const_cast ist hier die sicherste Form von Cast, da es nur die Konstante entfernt und keine anderen lustigen Dinge tut. execvp wird die Werte sowieso nicht bearbeiten.

Wenn Sie alle Umwandlungen vermeiden möchten, müssen Sie diesen Code komplizieren, indem Sie alle Werte in ‘char*’-Typen kopieren, die sich nicht wirklich lohnen.

Benutzer-Avatar
Jeremy Friesner

Nicht direkt; Sie müssten den Vektor irgendwie als NULL-terminiertes Array von String-Zeigern darstellen. Wenn es sich um einen Vektor von Strings handelt, ist das einfach; Wenn es sich um eine andere Art von Daten handelt, müssen Sie herausfinden, wie Sie sie als Zeichenfolgen codieren.

1012530cookie-checkSo übergeben Sie einen Vektor an execvp

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy