Einen String zerlegen?



  • Hallo,

    ich hab ein kleines Programm geschrieben, dass einen 4*4 stelligen Registry eintrag aendert.

    Den original serial, der geaendert werden soll, möchte ich beim Programmstart in 4 Tedit fenstern mit jeweils vier Stellen einzeln anzeigen.
    Ich muss also den AnsiString ( bei Borland sind alle String AnsiStrings? ) zerlegen oder einzelne Zeichen auslesen

    So lese ich den Registry eintrag aus:

    AnsiString aktuellerkey; 
    aktuellerkey = regKey->ReadString("UID");
    

    aktuellerkey sieht z.B. so aus : 2A72-6O66-929W-4QC6
    Da TRegistry anscheinend nur mit AnsiStrings arbeitet, ist aktueller Key auch einer...

    Um mein Vorhaben nun zu realisieren, muss ich ja praktisch den string auseinander nehmen, bzw. die ersten 4 Zeichen auslesen und in Tedit oder eine Veriable schreiben.

    char* charPointer; 
    int len=10; 
    char* chstr ="bullo"; 
    
    charPointer= new char[len*sizeof(char)]; //hole speicher 
    
    strcpy(charPointer, chstr);   //kopiere die adresse von chstring zu charPointer 
    
    Memo1->Lines->Add (charPointer); //lese Char Pointer aus  
    Code: 
    char* charPointer; 
    int len=10; 
    char* chstr ="bullo"; 
    
    charPointer= new char[len*sizeof(char)]; //hole speicher 
    
    strcpy(charPointer, chstr); //kopiere die adresse von chstring zu charPointer 
    
    Memo1->Lines->Add (charPointer); //lese Char Pointer aus  
    Code: 
    char* charPointer; 
    int len=10; 
    char* chstr ="bullo"; 
    
    charPointer= new char[len*sizeof(char)]; //hole speicher 
    
    strcpy(charPointer, chstr);   //kopiere die adresse von chstring zu charPointer 
    
    Memo1->Lines->Add (charPointer); //lese Char Pointer aus
    

    So funktioniert es aber nur mit char*

    Hat jemand vielleicht eine Idee?

    Danke schonmal
    mfg
    Simon



  • Sieh dir in der Hilfe mal die Klasse AnsiString an, besonders die Methoden Pos() und SubString(). Dann kannst du auch auf den Umweg über char-Arrays lassen. 😉



  • Welche Version vom Builder hast du? Wenn du Version 6 hast, schau dir doch mal TStringList (speziell DelimitedText) an.



  • Hallo

    Wir haben doch bereits gesagt, das du auf char * verzichten kannst.
    Hier mal ein Beispiel für die ersten vier Buchstaben

    AnsiString aktuellerkey;
    aktuellerkey = regKey->ReadString("UID");
    AnsiString Part = aktuellerkey.SubString(1, 4); // ersten 4 Zeichen kopieren
    aktuellerkey.Delete(1, 5); // ersten 5 Zeichen (inklusive des Bindestriches) löschen
    

    bis bald
    akari



  • Danke fuer die schnelle Antwort...

    Hab mir des angeschaut und versucht die funktionen einzubinden mit SubStr(), aber dann sagt er dass ansistring nicht in char* int AnsiString gewandelt wird... Ich versteh des net ganz die hilfe im builder dazu ist auch bissi knapp...

    Könnte es doch eigentlich so in einen char schreiben?

    Hab es so auch aus der faq hier gezogen, doch dann stuerzt mein Programm ab, weisst du warum dass nicht geht?

    char einbuchstabe = aktuellerkey[2];



  • Ach genau, wenn er abstuerzt, öffnet er die Seite dstring.h und
    makiert diese Zeile:

    ThrowIfOutOfRange(idx); // Should Range-checking be optional

    ...



  • s0h0 schrieb:

    ansistring nicht in char* (...) Könnte es doch eigentlich so in einen char schreiben?

    Wo kommen denn die Chars schon wieder her?

    char einbuchstabe = aktuellerkey[2];

    Warum das denn? Was soll das werden? Jedenfalls kannst du nicht auf Zeichen 2 Zugreifen, wenn dein String (?) z.B. leer ist.



  • Hallo

    char einbuchstabe = aktuellerkey[2];
    

    sollte funktionieren, solange in aktuellerkey 3 oder mehr Zeichen stehen.
    Las dir vorher mal den Wert anzeigen (Debuggen, siehe FAQ)

    bis bald
    akari



  • 2 oder mehr Zeichen.
    Bei AnsiString beginnt die Zählung bei 1 und nicht bei 0.



  • PuppetMaster2k schrieb:

    Sieh dir in der Hilfe mal die Klasse AnsiString an, besonders die Methoden Pos() und SubString(). Dann kannst du auch auf den Umweg über char-Arrays lassen. 😉

    Mehr gibt es dazu nicht zu sagen.



  • Hallo Joe,

    Das haben akari und ich ihm auch schon ein paar mal gesagt (im hierher verschobenen Thread).



  • ok. danke...

    ich habs ja auch schon durchgelesen aber habs halt (noch) nicht hinbekommen... weil er wie gesagt den datentyp nicht aktzeptiert den ich dazu ubergebe bzw. ich es anscheinend noch nicht ganz verstehe.

    vielleicht noch ein tip, wonach ich suchen soll,
    wenn ich will, dass der cursor ins 2te edit fenster springt wenn ich die maximal zeichen in edit1 eingegeben hab?



  • überleg doch, welche Events du abfangen musst und was du überprüfen würdest, wenn du selber entscheiden müsstest, ob der cursor weiter springen soll.
    ich empfehle dir auch mal da reinzuschauen: http://bcb-tutorial.c-plusplus.net/inhalt.html



  • Habs jetzt so gemacht... 🙂
    auf jeden fall funzt es

    char *bVar = aktuellerkey.c_str();  // string in array umwandeln
    //int stringlaenge = aktuellerkey.Length();
    
    AnsiString key1 = bVar[0];
    AnsiString key2 = bVar[1];
    AnsiString key3 = bVar[2];
    AnsiString key4 = bVar[3];
    AnsiString key5 = bVar[4];
    AnsiString key6 = bVar[5];
    AnsiString key7 = bVar[6];
    AnsiString key8 = bVar[7];
    AnsiString key9 = bVar[8];
    AnsiString key10 = bVar[9];
    AnsiString key11 = bVar[10];
    AnsiString key12 = bVar[11];
    AnsiString key13 = bVar[12];
    AnsiString key14 = bVar[13];
    AnsiString key15 = bVar[14];
    AnsiString key16 = bVar[15];
    AnsiString key17 = bVar[16];
    AnsiString key18 = bVar[17];
    AnsiString key19 = bVar[18];
    
    AnsiString keyA = key1 + key2 + key3 + key4;
    AnsiString keyB = key6 + key7 + key8 + key9;
    AnsiString keyC = key11 + key12 + key13 + key14;
    AnsiString keyD = key16 + key17 + key18 + key19;
    
    Edit1->Text = keyA;
    Edit2->Text = keyB;
    Edit3->Text = keyC;
    Edit4->Text = keyD;
    


  • Viel umständlicher ging es wohl nicht mehr. Was gefällt dir an akaris Lösung mit SubString nicht.

    AnsiString keyA = aktuellerkey.SubString(1,4);
    AnsiString keyB = aktuellerkey.SubString(6,4);
    AnsiString keyC = aktuellerkey.SubString(11,4);
    AnsiString keyD = aktuellerkey.SubString(16,4);
    

    Diese Hilfsstrings kann man auch noch weglassen und direkt auf edit->Text schreiben.



  • AHHHH! Jetzt check ich es! und es funktioniert auch genauso!
    is ja wirklich viel viel einfacher...

    man man man, naja uebung macht den meister...

    DANKE!!!


Anmelden zum Antworten