Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

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

Diskussion: [C++] Simple Frage bezüglich string und const char* im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo Leute, ich kann mir gerade einfach keinen Reim drauf machen. Hab auch nicht allzu viel Erfahrung mit C ...

Antwort
Alt 29.01.12, 21:04   #1 (permalink)
 
Registriert seit: 03.04.11
Tsjuder Leistung: 8086
Likes: 10
erledigt [C++] Simple Frage bezüglich string und const char*

Anzeige

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.

Geändert von Tsjuder (30.01.12 um 13:11 Uhr)
Tsjuder ist offline   Mit Zitat antworten
Alt 29.01.12, 21:11   #2 (permalink)
 
Benutzerbild von bad_alloc
 
Registriert seit: 27.12.07
bad_alloc Leistung: 8086
Likes: 39
Standard

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.
__________________
You shoot yourself in somebody else's foot.|Dann gabs da noch den Mathematiker der P?=NP in O(1) erklärte.
|[A]| = p(·,|[A]|)+1
bad_alloc ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 29.01.12, 21:11   #3 (permalink)
Member of Honour
 
Registriert seit: 02.10.01
Indi Leistung: Z3
Likes: 0
Standard

String ist eine Klasse, char ein Datentyp.
Indi ist offline   Mit Zitat antworten
Alt 29.01.12, 21:13   #4 (permalink)
 
Benutzerbild von ntor
 
Registriert seit: 31.07.11
ntor Leistung: Z3
Likes: 1
Standard

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:
Zitat:
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")

Zitat:
String ist eine Klasse, char ein Datentyp.
Wait, what?
Er benutzt doch c_str() zur Umwandlung , oder lügen meine Augen jetzt ?
__________________
Nützt die Feder nichts , ist der Schreiber schuld

Geändert von ntor (29.01.12 um 21:24 Uhr)
ntor ist offline   Mit Zitat antworten
Alt 29.01.12, 21:23   #5 (permalink)
Themenstarter
 
Registriert seit: 03.04.11
Tsjuder Leistung: 8086
Likes: 10
Standard

Alle Antworten gleichzeitig .

OK danke erstmal.

Zitat:
Zitat von bad_alloc Beitrag anzeigen
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?

Zitat:
Zitat von Indi Beitrag anzeigen
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.
Tsjuder ist offline   Mit Zitat antworten
Alt 30.01.12, 06:39   #6 (permalink)
 
Benutzerbild von ntor
 
Registriert seit: 31.07.11
ntor Leistung: Z3
Likes: 1
Standard

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
__________________
Nützt die Feder nichts , ist der Schreiber schuld
ntor ist offline   Mit Zitat antworten
Alt 30.01.12, 13:11   #7 (permalink)
Themenstarter
 
Registriert seit: 03.04.11
Tsjuder Leistung: 8086
Likes: 10
Standard

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 . 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!
Tsjuder ist offline   Mit Zitat antworten
Alt 30.01.12, 17:26   #8 (permalink)
 
Benutzerbild von bad_alloc
 
Registriert seit: 27.12.07
bad_alloc Leistung: 8086
Likes: 39
Standard

Zitat:
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.
__________________
You shoot yourself in somebody else's foot.|Dann gabs da noch den Mathematiker der P?=NP in O(1) erklärte.
|[A]| = p(·,|[A]|)+1
bad_alloc ist offline   Mit Zitat antworten
Alt 30.01.12, 17:51   #9 (permalink)
Themenstarter
 
Registriert seit: 03.04.11
Tsjuder Leistung: 8086
Likes: 10
Standard

Zitat:
Zitat von bad_alloc Beitrag anzeigen
[...] allen Funktionen die damit zusammenhängen. Das erspart langfristig viel Arbeit.
Gibts denn eine Funktion bzw. eine Methode die einen std::string als Eingabeparameter hat für Hostname zu IP?
Tsjuder ist offline   Mit Zitat antworten
Alt 30.01.12, 19:56   #10 (permalink)
 
Benutzerbild von bad_alloc
 
Registriert seit: 27.12.07
bad_alloc Leistung: 8086
Likes: 39
Standard

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);
}
__________________
You shoot yourself in somebody else's foot.|Dann gabs da noch den Mathematiker der P?=NP in O(1) erklärte.
|[A]| = p(·,|[A]|)+1
bad_alloc ist offline   Mit Zitat antworten
Alt 30.01.12, 20:54   #11 (permalink)
 
Benutzerbild von ntor
 
Registriert seit: 31.07.11
ntor Leistung: Z3
Likes: 1
Standard

Zitat:
Zitat von bad_alloc Beitrag anzeigen
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

Zitat:
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
__________________
Nützt die Feder nichts , ist der Schreiber schuld

Geändert von ntor (30.01.12 um 21:03 Uhr)
ntor ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » [C++] Simple Frage bezüglich string und const char*
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Frage bezüglich SSH Ehnoah (In)security allgemein 10 01.04.11 07:15
Frage bezüglich OpenNMS Sfire83 Network · LAN, WAN, Firewalls 0 15.02.11 15:48
[C] char in string gugugs Code Kitchen 6 15.05.10 03:19
[VB.NET] Char Array in String funktioniert nicht sulpsulpc Code Kitchen 5 07.05.10 17:52
String <=> cli::array^ Umwandlung ChiefWiggum Code Kitchen 6 08.02.08 19:30


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61