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 derstd::strings
zunächst durch den compiler. dann sind Sie versucht zu ordnenstd::string
zu einemchar*
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 Listestd::string
s? 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"
istconst char[2]
." Ein string-literal ist nicht einstd::string
noch automatisch konvertiert, sofern eine solche Umwandlung beantragt wird (z.B. durch die Erkennung derstd::string
mit ihm).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Möglichkeit:
Nur denken Sie daran:
Obwohl aus der Formulierung der Frage, syntaktisch ist es die gleiche Arbeit entweder Weg, wenn es war ein
vector<const char*>
als wenn es einvector<char*>
sowieso (du bist nicht das ändern der Quelle wenn Sie kopieren, so spielt keine Rolle, ob Sie könnte ändern Sie die Quelle), so würde ich halte mich an die übung, als ob du gerade getan hast:Ich denke, die
char
vsconst char
Unterschied macht viel aus, bei dieser Aufgabe.Für das eigentliche kopieren, verwenden Sie eine Füllung, die iterator-Konstruktor mit Argumenten:
Sehen Beispiel.
Wenn es eine müssen für editierbare Zeichen in der Quelle, verwenden Sie einfach die zweite version, die du gepostet:
Ergänzung: Die Argumente der main
argc
undargv
sind ein gutes Beispiel vonSehen wie werden argc und argv übersetzt in einen Vektor von Strings.
Könnten Sie versuchen, so etwas wie dieses: