Wie aus initialisieren vector<char *> mit string-literalen?

Das problem kommt von einer übung auf C++ Primer 5th Edition:

Schreiben Sie ein Programm zuordnen, um die Elemente aus einer Liste von char* - Zeiger
C-Stil Zeichenketten zu einem Vektor von strings.

----------------Oringinal Frage------------

Zuerst habe ich versucht, die folgenden etwas direkte Art und Weise:

vector<char *> vec = {"Hello", "World"};
vec[0][0] = 'h';

Aber kompilieren des Codes bekomme ich eine Warnung:

temp.cpp:11:43: warning: deprecated conversion from string constant to char*’ [-Wwrite-strings]
     vector<char *> vec = {"Hello", "World"};
                                           ^ 

Und ausführen der ./ein.heraus bekomme ich einen

Segmentation fault (core dumped)

Ich denke, es ist weil ich versuche zu schreiben, um einen const-char. Also versuche ich einen anderen Weg:

char s1[] = "Hello", s2[] = "World";
vector<char *> vec = {s1, s2};
vec[0][0] = 'h';

Es ist OK diese Zeit. Aber es scheint ein wenig mühsam. Gibt es irgendeine andere elegante Methode zum initialisieren einen Vektor mit string-literalen?

  • Sie können nicht ändern Sie den Inhalt von einem string-literal. Bitte verwenden Sie std::vector<std::string> (std::string konstruiert werden können, die aus einem string-literal) live Beispiel
  • String-Literale sind array of n const char ist, können Sie mehr details dazu finden Sie hier. Die Umwandlung war ok in C, aber ist nicht erlaubt, in C++, genau wegen der Frage mit dem Versuch, Sie zu ändern, das ist Undefiniertes Verhalten.
  • Ich weiß, es ist besser, auf vector<string> aber die übung auf den C++ primer bittet mich zum konvertieren eines vector<char *> in vector<string>. Also ich Frage mich, wie Sie zu initialisieren.
  • Danke. Ich habe gelesen, dass link, aber ich möchte nur wissen, die richtige Art und Weise zu initialisieren einen Vektor<char *>.
  • Auch von dem, was ich gesehen habe {"foo", "bar"} umgewandelt werden, um eine Liste der std::strings zunächst durch den compiler. dann sind Sie versucht zu ordnen std::string zu einem char* was nicht.
  • Können Sie klären, was Sie erwarten, dass die ownership Semantik werden? Sollte der vector-Elemente eigenen Speicher, auf die Sie verweisen, oder ist es OK, um zu zeigen, dass Sie etwas, das überleben wird die vector?
  • Warum auf der Erde würde {"foo", "bar"} erzeugen Sie eine Liste std::strings? Können Sie das noch näher erläutern?
  • Ich denke, dass der Vektor nur eigenen den Zeiger auf char.
  • Können Sie angeben, welche übung in der C+ Primer und erklären Sie kurz das Ziel ist es nicht klar aus deinem Kommentar, was das Ziel ist.
  • Sehr nett von dir! Fünfte Ausgabe Übung 9.14: Schreiben Sie ein Programm zuordnen, um die Elemente aus einer Liste von char* - Zeiger auf C-Stil Zeichenketten, um einen Vektor von Zeichenketten.
  • std::vector<std::string> vec(argv, argv + argc); Nur übergeben zu müssen, in manchen Befehlszeilen-Argumente 😉
  • Write a program to assign the elements from a list of char* pointers to C-style character strings to a vector of strings - Bitte fügen Sie dieser Aufgabe Beschreibung auf die Frage! Danke.
  • Vielen Dank für Ihre Anregung.
  • Vielen Dank, jetzt eine gute Frage.
  • Der Artikel, den ich ich hatte, in meinem Kopf ist: stackoverflow.com/questions/24112281/.... Nach der lesewiederholung es ich könnte falsch sein.
  • Diese Frage befasst sich mit einer std::vector<std::string>. Die akzeptierte Antwort sagt sogar, dass "die Art der "a" ist const char[2]." Ein string-literal ist nicht ein std::string noch automatisch konvertiert, sofern eine solche Umwandlung beantragt wird (z.B. durch die Erkennung der std::string mit ihm).

InformationsquelleAutor Warbean | 2015-01-23
Schreibe einen Kommentar