char[5][5] - kopiert mehrfach rein
-
Hi, sorry im voraus wenns sowas schonmal gab aber das is einfach zu unkonkret als das ich mit der Suche was finde...
char n1[5][5]; String n2="abcde"; strcpy(n1[0],n2.c_str()); n2="fghij"; strcpy(n1[1],n2.c_str()); n2="klmno"; strcpy(n1[2],n2.c_str()); n2="pqrst"; strcpy(n1[3],n2.c_str()); n2="uvwxy"; strcpy(n1[4],n2.c_str()); for(int x=0;x<5;x++)ListBox1->Items->Add(n1[x]);ListBox sieht so aus:
abcdefghijklmnopqrstuvwxy fghijklmnopqrstuvwxy klmnopqrstuvwxy pqrstuvwxy uvwxyTja bin für alle Vorschläge offen...
-
In C muss immer 1 Byte mehr reserviert werden als der String eigentlich lang ist, da Strings immer mit dem Zeichen 0x00 abgeschlossen werden. Was jetzt bei dir passiert ist eigentlich der Beginn eines Bufferoverflow. Du überschreibst das letzte Zeichen (0x00) wodurch die Stringfunktionen nicht mehr wissen, wann der String aufhört.
Lösung: Mach das Stringarray um 1 Element grösser und benutz' statt strcpy unbedingt strncpy in Kombination mit
sizeof(n1[0])-1was dir die maximal speicherbare Stringlänge liefert. Dann hast du derlei PRobleme niemehr.
Eine Frage hab ich aber noch: Wozu füllst du das alles mühsam in ein Array, wenn du nacher trotzdem ne Stringliste befüllst?
-
Danke funktioniert. War wie immer zu einfach ums zu finden

Zu deiner Frage, das war nur ein Beispiel um mein Problem so einfach wie möglich zu zeigen, in meinem Programm speichere ich sachen damit über fstream in dateien.
Könnte man auch etwas anderes als char bei fstream verwenden um zeichenketten zu speichern? bei char muss man ja immer vorher festlegen wieviel es gibt und bei String gibts lauter Fehler und komische Zeichen...
-
Hallo
sowohl std::string als auch AnsiString lassen sich zusammen mit allen Standard-Streams benutzen
bis bald
akari
-
wenn ich so mache:
void __fastcall TForm1::Button1Click(TObject *Sender) { fstream f("c:\\testc\\datei\\stream_string.dat",ios::out|ios::binary); String a="abcdefghijklmnopqrstuvwxyz"; f.write((char*)&a,sizeof(a)); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { fstream f("c:\\testc\\datei\\stream_string.dat",ios::in|ios::binary); String b; f.read((char*)&b,sizeof(b)); Edit1->Text=b; }steht im Edit:
abcdefghijklmnopqrstuvwx(mit dem/den letzten Buchstaben hauts nie hin, hängt das auch mit dem \0 zusammen?
-
Hallo
ist auch komplett falsch.
Zuerst einmal schaust du in die C++ FAQ hier in Forum, in den Thread Dateien und Ströme. Dort wird erklärt wie man streams richtig verwendetstd::fstream f(...); std::string text; f >> test; // Liest alles bis zum nächsten Leerzeichen oder ZeilenumbruchUm das gleiche mit AnsiString machen zu können brauchst du nur eine Kleinigkeit zu beachten. In der BCB-Hilfe zu AnsiString steht das du den include zu den streams nur vor den include für VCL machen must
#include <fstream> #include <vcl.h> ... std::fstream f(...); AnsiString text; f >> test; // Liest alles bis zum nächsten Leerzeichen oder Zeilenumbruchbsi bald
akari