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
     uvwxy
    

    Tja 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])-1
    

    was 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 verwendet

    std::fstream f(...);
    std::string text;
    f >> test; // Liest alles bis zum nächsten Leerzeichen oder Zeilenumbruch
    

    Um 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 Zeilenumbruch
    

    bsi bald
    akari


Anmelden zum Antworten