Nullterminierten String in AnsiString wandeln



  • Ich habe eine TMemo Komponente, die ich mit Text füllen möchte. Die AnsiString Methoden sind mir dabei zu langsam. Deswegen habe ich ein dynamisches char-Feld erzeugt, das in einem Algorithmus anstelle des Textstrings von TMemo gefüllt wird.
    Am Schluss möchte ich diesen nullterminierten String TMemo->Text zuweisen. Jedoch geht dabei irgendetwas schief. Kann mir jemand mit einer passenden Methode helfen?


  • Mod

    Hallo

    Jedoch geht dabei irgendetwas schief

    Bitte sag uns WAS schiefgeht, dann koennen wir dir sicher helfen
    Schoen waere es auch wenn du uns ein bischen Code zeigst.

    Am Schluss möchte ich diesen nullterminierten String TMemo->Text zuweisen

    Mfg
    Klaus



  • Hallo

    Was KlausB damit sagen will : wenn du einen korrekten Null-terminierten C-String hast, dann brauchst du keine extra passende Methode. Zuweisen reicht völlig aus :

    char* c_string = ...;
    Memo1->Lines->Text = c_string;

    Wenn bei dir etwas nicht klappt, liegt das nicht an Memo, sondern an den Daten in deinem C-String. Ohne genauere Einblicke können wir dazu aber nichts weiter sagen.

    bis bald
    akari



  • Hier ist die auf das wesentliche gekürzte Methode:

    void __fastcall TfrmMain::btnErzeugenClick(TObject *Sender)
    {
        if(lbledtLaenge->Text.IsEmpty()) //wenn das Textfeld leer ist, wird nur ein Hinweis ausgegeben
            ShowMessage("Länge des Passworts wurde nicht angegeben.");
        else if(lbledtLaenge->Text.ToInt()<=4000) //das Passwort darf nicht länger als 4000 Zeichen lang sein
        {
            int pl=lbledtLaenge->Text.ToInt(); //Textlänge wird in einer Int-Variable gespeichert, dass nicht jedesmal die Zeichenlängenmethode aufgerufen werden muss
    
            char* text;
            text=new(std::nothrow)char[pl+1];
            if(text==NULL) //falls kein Speicherplatz frei ist, wird die Methode mit einer Nachricht beendet
                ShowMessage("Der Computer verfügt momentan nicht über genügend freien Arbeitsspeicher ("+String(sizeof(text))+"Byte)");
            else
            {
                srand(time(NULL));
                char x, checker=0;
    
                for (int i=0; i<pl; i++)
                {
                    x=(rand()%26)+65;
                    if (checker<1)
                    {
                       text[i]=x;
                       x=(rand()%2)+1;
                       checker+=x;
                    }
                    else
                    {
                       x=rand()%5;
    
                       switch (x)
                       {
                          case 0:
                               {
                                  text[i]='A';
                                  break;
                               }
                          case 1:
                               {
                                  text[i]='E';
                                  break;
                               }
                          case 2:
                               {
                                  text[i]='I';
                                  break;
                               }
                          case 3:
                               {
                                  text[i]='O';
                                  break;
                               }
                          case 4:
                               {
                                  text[i]='U';
                                  break;
                               }
                       }
                       checker=0;
                    }
                }
        }
        text[pl]='\0'; //nullterminierter String bekommt seine binäre Null
        memPasswort->Text=text; //nullt. String wird dem AnsiString zugewiesen (funktioniert nicht)
        delete []text; //dynamisch angefordertes Array wird gelöscht
        }
        else if(lbledtLaenge->Text.ToInt()>4000)
            ShowMessage("Bitte wählen Sie eine Länge von 1 bis maximal 4000 Zeichen. Andernfalls wird der Prozess zu lange andauern.");
    }
    


  • Also ich habs bei mir mal laufen lassen und es funktioniert..

    Allerdings musst du für ein Memo wohl Memo->Lines->Add(text); verwenden und nicht ->Text

    Achja, bei mir konnte ich auch

    text[pl]='\0'; //nullterminierter String bekommt seine binäre Null
    

    weglassen..

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      if(lbledtLaenge->Text.IsEmpty())
      {
        ShowMessage("Länge des Passworts wurde nicht angegeben.");
      } else if(lbledtLaenge->Text.ToInt()<=4000)
      {
        int pl=lbledtLaenge->Text.ToInt();
        char* text;
        text=new(std::nothrow)char[pl];
        if(text==NULL)
        {
          ShowMessage("Der Computer verfügt momentan nicht über genügend freien Arbeitsspeicher ("+String(sizeof(text))+"Byte)");
        } else
        {
          srand(time(NULL));
          char x, checker=0;
          for (int i=0; i<pl; i++)
          {
            x=(rand()%26)+65;
            if (checker<1)
            {
              text[i]=x;
              x=(rand()%2)+1;
              checker+=x;
            } else
            {
              x=rand()%5;
              switch (x)
              {
                case 0: text[i]='A'; break;
                case 1: text[i]='E'; break;
                case 2: text[i]='I'; break;
                case 3: text[i]='O'; break;
                case 4: text[i]='U'; break;
              }
              checker=0;
            }
          }
        }
        memPasswort->Text=text; // TEDIT
        Memo1->Lines->Add(text); // TMEMO
        delete []text;
      } else
      {
        ShowMessage("Bitte wählen Sie eine Länge von 1 bis maximal 4000 Zeichen. Andernfalls wird der Prozess zu lange andauern.");
      }
    }
    


  • Allerdings musst du für ein Memo wohl Memo->Lines->Add(text); verwenden und nicht ->Text

    Mhm. Wenn ich den ganzen Text bearbeiten möchte und nicht die einzelnen Strings, geht's auch mit Text.



  • else if(lbledtLaenge->Text.[b]ToInt()[/b]<=4000)
    

    Length() liefert die Länge vom String zurück, ToInt() wandelt den Inhalt von Edit in eine Zahl um...



  • Daran liegt's nicht. Der Benutzer gibt eine Zahl in lbledt->Text ein.



  • Naja ich verstehe eh nicht woran es liegen soll oder was überhaupt liegt.

    Es compiliert bei mir, wie schon erwähnt, ohne Probleme.

    Kriegst du irgendeinen Fehler?!



  • Ich bekommen keinen Fehler. Das Kompilieren ist nicht das Problem. Ich bekomme merkwürdige Zeichen ausgegeben anstelle einer zufällig generierten Zeichenkombination.

    EDIT: Jetzt funktioniert's. Die Sache lag an einem blöden Verlinkungsfehler. Komischerweise wurde eine Unit.cpp von einer alten Version des unoptimierten Programms benutzt...


Anmelden zum Antworten