const array initialisieren



  • Hallo,

    wisst ihr, wie man einen Vektor von Strings in ein Array von entsprechenden C-Strings überführen kann:

    void foo(const std::vector<std::string> strings)
    {
      const char* c_strings[strings.size() + 1];
    
      // wie bekommt man nun die Strings aus "strings" in das Array "c_strings" rein?
    }
    

    Grüße


  • Mod

    Gar nicht. Aber fragen wir mal anders: Was hast du eigentlich vor? Klingt so, als wolltest du irgendeine C-Schnittstelle benutzen. Dabei ist es aber normalerweise gar nicht nötig, irgendwelche Verrenkungen zu versuchen, weil sowohl vector als auch string bereits Methoden anbieten, die zu typischen C-Schnittstellen passen.



  • Hallo,

    genau, ich möchte den Vektor "strings" der Funktion execvp (http://linux.die.net/man/3/execvp) als zweites Argument übergeben.

    Hast du eine elegante Lösung?

    Viele Grüße


  • Mod

    Erste Beobachtung: Dann kannst du ja auch nicht-const char Arrays nehmen, wodurch es einfach möglich wäre, die Zeichenketten in diese zu kopieren.

    Zweite Beobachtung: Am einfachsten wäre es wohl, einen neuen vector<const char*> zu erstellen, und diesen zu füllen mit den c_str()s der Strings. Denk dran, dass der vector hier mit einem nullptr beendet werden muss, weil die Aufrufkonvention von exec das so verlangt!

    Leider ist es hier nicht möglich, den vector<string> direkt in die richtige Form zu biegen. Man kann zwar sowohl vector als auch string jeweils einzeln in die richtige Form bringen, aber nicht die beiden verschachtelten Strukturen gemeinsam.

    Also kurz:

    vector<const char*> for_exec;
      transform(strings.begin(), strings.end(), back_inserter(for_exec),
                [](const string& str){return str.c_str();});
      for_exec.push_back(nullptr);
      // exec-Aufruf mit for_exec.data() als Argument.
    


  • Vielen Dank


Log in to reply