Problem mit char und string
-
Hallo zusammen,
ich möchte über ein edit fenster ein wort eingeben, das zunächst in einer variablen vom typ string gespeichert wird. Anschließend soll diese variable in ein char Array umgewandelt werden, damit ich mit den einzelnen Buchstaben arbeiten kann. Ich habe etwas versucht, doch geht es so leider nicht:String wort=Edit1->Text; char array[]=wort.c_str(); //ich glaube "c_str()" ist hier falsch"
1.) Kann mir jemand einen Tipp geben, wie ich dieses Problem löse. Die Suchfunktion funktioniert leider bei mir gerade nicht, denn ich könnte mir vorstellen, dass ich auch was zu diesem Thema finden könnte!
2.) Wandelt der Befehl "c_str()" einen char in einen string um oder wofür ist dieser gut?
Vielen Dank für eure Hilfe
lg, freakC++
-
Hallo,
versuch das mal:String MeinString; char MeinChar; const char *p; p = MeinString.c_str(); strcpy(MeinChar,p);
Grüße
-
Hallo,
freakC++ schrieb:
...
String wort=Edit1->Text; char array[]=wort.c_str(); //ich glaube "c_str()" ist hier falsch"
1.) Kann mir jemand einen Tipp geben, wie ich dieses Problem löse. ...
Du könntest den Text in eine AnsiString-Variable speichern und dann derart
array[0]= AnsiStringVariable[1]; // bei AnsiString beginnt der Index bei 1 !!!
in einer Schleife dein char-Array füllen.
freakC++ schrieb:
...2.) Wandelt der Befehl "c_str()" einen char in einen string um oder wofür ist dieser gut?...
Das steht eigentlich in jeder Hilfe und auch bei google findet man mehr als genug
MfG
-
Hallo
Anschließend soll diese variable in ein char Array umgewandelt werden, damit ich mit den einzelnen Buchstaben arbeiten kann
Brauchst du doch gar nicht. Auch die String-Klasse bietet vollen Zugriff auf die chars, ebenfalls über den []-Operator. Aufpassen muß man nur auf den Index, denn bei String beginnt die Zählung der Elemente bei 1 und nicht bei 0
String wort=Edit1->Text; for (int lv = 1; lv <= wort.Length(); ++lv) { char c = wort[lv]; }
Wandelt der Befehl "c_str()" einen char in einen string um oder wofür ist dieser gut?
Die Methode (!) c_str() liefert einen Zeiger auf einen Null-terminierten C-String. Das ist ein sehr grundlegender Datentyp, und wird heute nur noch für sehr systemnahe Aufgaben gebraucht. Dann aber wie du schon gesagt hast zum Konvertieren von String zu char*. Aber du solltest immer wenn es geht die String-Klasse nehmen, denn diese ist komfortabel, wird von den Komponenten der VCL benutzt und spart dir fehleranfällige Speicherverwaltung.
char array[]=wort.c_str();
Das ist falsch, und zeigt das dir noch die Grundlagen der einfachsten Datentypen fehlen. Es gibt zwei richtige Alternativen :
const char* array=wort.c_str();// Du hast einen readonly-Zeiger
char* array = new char[wort.Length()+1]; strncpy(array, wort.c_str(), wort.Length()); array[wort.Length()] = 0; // mit array arbeiten delete[] array; // Kopiert den Inhalt aus wort in ein unabhängiges Array, das bearbeitet werden kann
bis bald
akari
-
Hallo zusammen,
viele Dank schonmal für die schnellen Antworten. Ich muss gestehen, dass ich vor allem in diesem Bereich leidernoch nicht sehr viele Kenntnisse habe, doch arbeite ich daran. Zu akaris Code habe ich noch ein paar Fragen. Ich habe noch eine kleine Änderung vorgenommen:String wort=Edit1->Text; for (int i=1; i<wort.Length(); i++) { char c=wort[i+1]; Label1->Caption=c; }
Nun ist es so, dass ich innerhalb der Schleife, beispielsweise wie oben gezeigt, auf einen Buchstaben zugreifen kann. Hier wäre dies der Letzte des Wortes. Wenn ich nun aber auf einen belieben Buchstaben zugreifen möchte, könnte ich natürlich einfacherweise(und wie akari) beschrieben, von der Methode string.Length() Gebrauch machen.
Wenn ich nun aber ein char Array ebenfalls in dieser Schleife füllen möchte, so weiß ich leider auch noch nicht wie ich dies machen soll. So funktioniert es ja definitiv nicht:
String wort=Edit1->Text; for (int i=1; i<wort.Length(); i++) { char c[]=wort[i+1]; //Hier kommt natürlich ein Fehler! }
Was muss ich machen, damit ich diesen Fehler umgehe?? Ich denke, dass Kolumbus so etwas meine, doch weiß ich halt nicht wie ich es verwirklichen soll.
Vielen Dank
lg, freakC++
-
freakC++ schrieb:
String wort=Edit1->Text; for (int i=1; i<wort.Length(); i++) { char c[]=wort[i+1]; //Hier kommt natürlich ein Fehler! }
Naja, beim letzten Schleifendurchlauf kommt dieser Fehler.
Wegen dem +1 Willst du am Ende ein Teil des Strings abfragen, den es garnicht gibtString.Length = 10
du machst String[11]
-
AnsiString Wort= Edit1->Text; char cArray[100]; // nimm dann hier für die Anzahl der Array-Elemente einfach die maximale Wortlänge, die auftreten kann for(int i= Wort.Length() - 1, j= Wort.Length(); j > 0; i--, j--) // mit diesem Schleifenkopf schreibst du die einzelnen Zeichen von Wort, von hinten beginnend, in cArray { c[i]= wort[j]; }
Frohe Ostern!
-
Hallo zusammen,
das Problem ist dank eurer Hilfe gelöst.@halloei: Auch wenn ich einfach i schreibe kommt ebenfalls ein Fehler! Liegt es wirklich daran?
@Kolumbus: Du meinst doch sicherlich "cArray" in der Schleife anstatt nur "c"??
Vielen Dank für eure Hilfe und auch euch Frohe Ostern, obwohl heute erst Gründonnerstag ist und morgen erst mal Karfreitag ist!!!
lg, freakC++
-
Lies dir bitte den Post von akari noch mal komplett durch!
Dort hat er sogar schon gepostet, wie man den AnsiString in einen C-String kopiert:akari schrieb:
char* array = new char[wort.Length()+1]; strncpy(array, wort.c_str(), wort.Length()); array[wort.Length()] = 0; // mit array arbeiten delete[] array; // Kopiert den Inhalt aus wort in ein unabhängiges Array, das bearbeitet werden kann
Gruß
KK