S
soad schrieb:
netrobot schrieb:
void foo(string input)
{
cout << input << endl; // String ist gefuellt
const char* bar = input.c_str();
cout << bar << endl; // Nur das 1.Zeichen :( ?!?
}
es hat bi mir funktioniert
Das Problem war, dass ich zuvor noch strtok() verwendet habe, ganz nachvollziehen kann ich es zwar noch nicht, ...
Das mit dem strtok() ist die wesentliche Information dabei.
Gemäß Schnittstelle garantiert sttok() nicht, dass es nicht doch versucht, den String, den es "tokenized" zu verändern.
c_str() garantiert aber nur das erwartete ergebnis, solange der String unverändert bleibt ... deswegen gibt er auch einen const char* zurück (und nicht einen char* ).
Der von Kevinus gezeigte Weg ist kein "Hack", sondern der kanonische Weg, zwischen einem String und einem veränderbaren char-Buffer zu vermitteln: Kopieren eben.
(Allerdings ht er einen kleinen aber typischen Fehler drin - derseleb unterläuft mir auch immer:
Kevinus schrieb:
...
char *cBuffer=new char[cInput.length()+1]; // Ein Zeichen für "Nullbyte"
...
Außerdem sollte der Speicher mit delete[] nach Gebrauch wieder freigegeben werden - die new/copy/delete-Kiste ist ein gutes Beispiel dafür, warum man besser string in seinen SChnittstellen verwenden sollte )
Ist nicht besonders erstaunlich eigentlich, weil auch niemand auf die Idee käme, andere Typen würden eine "kopiefreie Konvertierung" überleben:
void quadriere(int*);
int main() {
char s[] = "123";
quadriere((int*) s); // wer erwartet, dass das klappt ?
...
Ebensowenig ist das mit string->char* erstaunlich - es ist eher erstaunlich, dass es überhaupt bei einigen wenigen Typen funktioniert (ich wäre aber immer sehr skeptisch, ob das gutes Design ist).
Gruß,
Simon2.