[C++] Simple Frage bezüglich string und const char*

Hallo Leute,
ich kann mir gerade einfach keinen Reim drauf machen. Hab auch nicht allzu viel Erfahrung mit C spezifischen Sachen.
Folgende 2 Beispielcodes:
Code:
string temp;
const char* hostname;
cin >> temp;
hostname = temp.c_str();
getaddrinfo(hostname,...);

---------------------
string temp;
cin >> temp;
getaddrinfo(temp.c_str(),...);

Warum funktioniert die erste Variante nicht, aber die zweite? Ich hab versucht nachzuvollziehen wo der Unterschied ist, aber ich kann es mir nicht wirklich erklären. Bei der ersten Variante findet er bei selber Eingabe den Host nicht, aber bei der zweiten Variante schon.

Vielen Dank.
 
Zuletzt bearbeitet:
const char* ist, wie der Name schon sagt konstant, d.h. nach der Initialisierung kannst du dessen Wert nicht mehr verändern. Eigentlich solltest du da einen Compilerfehler kriegen. Zudem ist (fast) alles was ein char*-String (auch bekannt als C-String) ist obsolet. Du solltest in C++ Programmen dich auf std::strings beschränken und alle Funktionen, die alte Strings benutzen meiden, bzw. wenn man mit solchen arbeiten muss, eben die Methoden .c_str() oder .c_str(char*) von std::string benutzen.
 
Möglicherweise ist das ein Schutzmechanismus um zu verhindern , dass der Speicher deallokiert wird aber der Pointer noch drauf verweist.
Versuch mal n "strcpy(hoststring,str.c_str());" (Davor musst du halt noch Speicher allokieren , oder du benutzt grad "strdup")

Viele Grüße
nt0r

EDIT:
const char* ist, wie der Name schon sagt konstant, d.h. nach der Initialisierung kannst du dessen Wert nicht mehr verändern. Eigentlich solltest du da einen Compilerfehler kriegen.
Löst einerseits das Problem nicht , ist andererseits falsch.
const char * --> Pointer auf const char (Kein Konstanter Pointer. Der wäre nämlich "const char * const" --> Konstanter Pointer auf "const char")

String ist eine Klasse, char ein Datentyp.
Wait, what? :D
Er benutzt doch c_str() zur Umwandlung , oder lügen meine Augen jetzt ?
 
Zuletzt bearbeitet:
Alle Antworten gleichzeitig :D.

OK danke erstmal.

const char* ist, wie der Name schon sagt konstant, d.h. nach der Initialisierung kannst du dessen Wert nicht mehr verändern. Eigentlich solltest du da einen Compilerfehler kriegen. Zudem ist (fast) alles was ein char*-String (auch bekannt als C-String) ist obsolet. Du solltest in C++ Programmen dich auf std::strings beschränken und alle Funktionen, die alte Strings benutzen meiden, bzw. wenn man mit solchen arbeiten muss, eben die Methoden .c_str() oder .c_str(char*) von std::string benutzen.

OK, dass habe ich mir auch erst gedacht, allerdings kann ich den const char* dann auch ausgeben und dort steht dann z.B. auch "www.google.de" drin. Daher verstehe ich auch nicht, wo dann letztendlich der Unterschied in der einen Variante ist, so dass eine funktioniert und die andere nicht.

Gibt es denn eine Funktion die einen std::string entgegen nimmt?

String ist eine Klasse, char ein Datentyp.

Hmmm eine nähere Erläuterung wäre gut, denn das war mir auch soweit klar. Ich übergebe doch in beiden Fällen ein const char*.

Ich muss im Nachinein zugeben, dass ich es doch etwas näher hätte erläutern sollen. Also wie gesagt: In beiden Fällen steht auch "www.google.de" im const char* drin, aber der Umweg über die eigene Variable funktioniert nicht, während die direkte Umwandlung innerhalb des Funktionsaufrufs funktioniert.
 
Hast du denn probiert , was ich gesagt habe?
Code:
/*...*/
std::string temp;
std::cin >> temp;
const char *hostname = new char[temp.length() + 1]
strcpy(hostname,temp.c_str());
/*...*/
Oder statt dem copy:
Code:
const char *hostname = strdup(temp.c_str());

Viele Grüße
nt0r

PS: Zu dem const-Mist hab ich meinen oberen Post editiert ;)
 
Ich hab meinen Code mal etwas bereinigt, da ich mit Netzwerkprogrammierung gerade erst angefangen habe und das Ganze ein wenig unübersichtlich wurde durch veraltete Tutorials, die z.B. noch gethostbyname benutzt haben. Ich hatte wohl anscheinend irgendwo anders einen Fehler im Code, denn mittlerweile funktioniert die erste Variante auch :rolleyes:. Wobei ich nicht wirklich wüsste wo der Fehler gewesen sein soll oder aber Eclipse hat Mist mit den Builds gebaut...passiert schonmal gerne, dass irgendwelche Fehler im Editor die ganze Zeit angezeigt werden an Stellen, bei denen schon längst was anderes steht oder sogar eine leere Zeile.

Aber wenn ihr sagt, ich sollte sowieso lieber mit den C++ Klassen arbeiten, dann werde ich das auch machen. Ich konnte mich bis jetzt nie wirklich entscheiden, wenn man eigentlich in C++ schreiben will, aber dann merkt, dass alle Funktionen die man benutzt in C implementiert sind.

Besten dank!
 
Versuch mal n "strcpy(hoststring,str.c_str());"
Nein, versuch das nicht. Wenn du Strings kopieren willst nutz str1.assign(str2);, aber bleib weg von den C-Strings und allen Funktionen die damit zusammenhängen. Das erspart langfristig viel Arbeit.
 
Laut dem POSIX standard nicht. Du kannst das entweder überall per .c_str() machen, oder eine eigene Funktion schreiben. Das kann man auch überladen, wobei du das eigentliche getaddrinfo explizit aus seinem namespace aufrufen musst, also vermutlich aus std::
Code:
int GetAdressInfo(string node, string service, const struct addrinfo *hints, struct addrinfo **res) {
  getaddrinfo(node.c_str(), service.c_str(), hints, res);
}
 
Nein, versuch das nicht. Wenn du Strings kopieren willst nutz str1.assign(str2);, aber bleib weg von den C-Strings und allen Funktionen die damit zusammenhängen. Das erspart langfristig viel Arbeit.

Wenn er das schon mit Pointer machen will, zeig ich ihm auch die C-Lösung. Man muss wissen was möglich ist. Naja meine Meinung ;)

Code:
int GetAdressInfo(string node, string service, const struct addrinfo *hints, struct addrinfo **res) {
  getaddrinfo(node.c_str(), service.c_str(), hints, res);
}
Deklarier forward-Funktionen doch lieber als 'inline' , benutze statt der copy bei (datenspeichernden) Objekten doch besser z.B. eine 'const std::string &' und gib auchn Wert zurück ;)
Das sind so kleine Performance-Schmankerl , die man zwar erst in Massen spürt , aber doch etwas uneleganten Code produzieren.

Viele Grüße
nt0r
 
Zuletzt bearbeitet:
Zurück
Oben