String -to- Variable
-
Was dagegen geht, ist sowas:
#include <iostream> #include <map> #include <string> using namespace std; int main() { map<string, string> my_map; my_map["bla"] = "muhahaha"; cout << my_map["bla"] << endl; }
Allerdings muss man da ein bisschen aufpassen, was man macht. Diese Variante sieht zwar sehr lesbar aus, wenn man aber zum Beispiel
map<string, string> my_map; my_map["bla"] = "muhahaha"; cout << my_map["foobar"] << endl;
schreibt (also vorher der map kein Element unter dem Schlüssel foobar zuweist), hat es den vermutlich ungewollten Effekt, dass in der map eine node unter dem Schlüssel foobar angelegt wird. In diesem Fall enthält die dann einen leeren String.
Die sicherere Variante ist etwas komplizierter, aber dafür...naja, eben sicher:
#include <iostream> #include <map> #include <string> using namespace std; int main() { map<string, string> my_map; my_map["bla"] = "muhahaha"; map<string, string>::iterator itr = my_map.find("bla"); if(itr != my_map.end()) { cout << itr->second << endl; } else { cout << "Nicht gefunden." << endl; } }
Der Iterator itr zeigt, nachdem ihm my_map.find("bla") zugewiesen wurde, auf die Node, die den Schlüssel "bla" hält. Der Wert dieser Node ist ein pair<string, string>, dass an erster Stelle den Schlüssel und an zweiter den Wert enthält. In diesem Fall wäre da also itr->first == "bla" und itr->second == "muhahaha". Wenn my_map.find mit einem Schlüssel aufgerufen wird, den die map nicht kennt, gibt sie my_map.end() zurück, das ist ein Iterator, der quasi hinter das Ende der map zeigt.
-
Leute was macht ihr denn für Sachen??
Wenn ich das richtig verstanden habe, möchte er (oder sie) einfach einen string mittels cout ausgeben.Das Problem ist aber, dass cout << keine strings akzeptiert, deshalb ist folgendes richtig:
#include <iostream> #include <string> int main() { string s = "muhahahahahahaaaaaa!!"; cout << s.c_str(); return 0; }
.c_str() ist eine Funktion, die strings in einen charpointer konvertiert. Kannst du dir merken, braucht man SEHR oft.
-
Ähm, man muss natürlich noch
using namespace std; angeben. Hab ich grad vergessen und ich kann Posts nicht editieren.
-
-CPP- schrieb:
Leute was macht ihr denn für Sachen??
Wenn ich das richtig verstanden habe, möchte er (oder sie) einfach einen string mittels cout ausgeben.Das Problem ist aber, dass cout << keine strings akzeptiert, deshalb ist folgendes richtig:
#include <iostream> #include <string> int main() { string s = "muhahahahahahaaaaaa!!"; cout << s.c_str(); return 0; }
.c_str() ist eine Funktion, die strings in einen charpointer konvertiert. Kannst du dir merken, braucht man SEHR oft.
muhahahahaha
roflwie geil!
Jo genau, namespace net vergessen
[Edit] sorry, hab mich wieder beruhigt
-
Nur mal so. Was war daran so witzig?
Stimmt doch...
-
warum geht bei mir dann das?
int main(int argc, char* argv[]) { string gehtnicht="Geht doch!!!!"; cout<<gehtnicht; return 0; }
-
5er1al schrieb:
warum geht bei mir dann das?
int main(int argc, char* argv[]) { string gehtnicht="Geht doch!!!!"; cout<<gehtnicht; return 0; }
Weil man nicht c_str() braucht um ihn mit cout auszugeben.
Deshalb geht das.
-
Unix-Tom schrieb:
5er1al schrieb:
warum geht bei mir dann das?
int main(int argc, char* argv[]) { string gehtnicht="Geht doch!!!!"; cout<<gehtnicht; return 0; }
Weil man nicht c_str() braucht um ihn mit cout auszugeben.
Deshalb geht das.ach und möglicherweise wollte ich das damit sagen??
-
Hallo!
Ich hab da mal noch 'ne Frage zu. Ich hab die Urfrage nämlich anders verstanden.
Nehmen wir einmal an ich hätte da eine Funktion foo(), und diese Funktion liefert mir einen String zurück (also quasi einen Zeiger auf einen) und jenen String möchte ich als Name einer Variable verwenden. Geht das mit dem Beispiel von Oxdeadbeef ?Gruß André.
-
Geht das überhaupt? Wenn ja, wie?
Bitte ein Beispiel mit Foo() und VariableNoch'n Gruß
-
weiß net ob du sowas meinst:
string foo(string text) { text+="Test"; return text; //mach irgendwas mit text } int main(int argc, char* argv[]) { string str ="Hallo"; string str2=foo(str); //übergibt str2 den bearbeiteten text cout<<str2; return 0; }
-
Nee, eigentlich eher:
int main( void ) { string text = "irgendwas"; int foo(text) = 15; printf("%i",irgendwasTest); }
Geht so was? Ich glaubs nich so recht geb die Hoffnung aber noch nicht auf
-
weiß echt net was du meinst!
-
Genau sowas wie der vorherige post, hab ich mir gedacht!
-
dann erklärt mir was ihr mit der funktion, die eine ganzzahl zurückgibt machen wollt?!
-
derAnder schrieb:
Nee, eigentlich eher:
int main( void ) { string text = "irgendwas"; int foo(text) = 15; //foo gibt irgendwasText zurück -> irgendwasText wird 15 zugewiesen printf("%i",irgendwasTest); //Ausgabe ist 15 }
-
Bsp.:
Die Funktion getName() gibt mir den Namen eines Konten in einem XML-Dokument zurück. Mit diesem namen möchte ich eine neue Instanz einer Klasse erzeugen.
Die Frage ist geht das? Wenn ja wie?
-
nicht direkt, aber auf umwegen mit der map methode die 0xdeadbeaf schon postete.
-
derAnder schrieb:
string text = "irgendwas"; int foo(text) = 15; //foo gibt irgendwasText zurück -> irgendwasText wird 15 zugewiesen
Und wie willst du dann auf die Instanz zugreifen? Immer 'foo(text)' schreiben? Dann kannst du auch gleich 'int foo = 15' schreiben.
C++ hat nunmal ein statisches Typsystem, dh sowas ist nicht möglich. Und nebenbei gesagt, du brauchst sowas auch nicht. Wenn du eine Laufzeit abhängige Instanz brauchst, dann gibt es zB die map Klasse (wie bereits erwähnt).derAnder schrieb:
Die Funktion getName() gibt mir den Namen eines Konten in einem XML-Dokument zurück. Mit diesem namen möchte ich eine neue Instanz einer Klasse erzeugen.
Die Frage ist geht das? Wenn ja wie?Wie bereits erwähnt, sowas kannst du mit 'ner Map machen. Genauso gut ist es aber auch möglich, wenn deine Klasse den Namen als Member hat und du speicherst alle Instanzen in einem dynamische Array, zB std::vector. Kommt halt immer darauf an, welche Anforderungen diese "Kontenverwaltung" hat.
-
5er1al schrieb:
Unix-Tom schrieb:
Weil man nicht c_str() braucht um ihn mit cout auszugeben.
Deshalb geht das.ach und möglicherweise wollte ich das damit sagen??
Wusste ich ja.
Ich wollte es nurmal für -CPP- klar machen. HIer lesen auch Anfänger mit und die sollen ja nichts falsches lernen.