Alternative für TStringList um einen String in 2er schritten zu addressieren



  • Hi,

    momentan benutze ich eine TStringList um einen String in 2er schritten zu addressieren, bsp:

    AnsiString tmp = "1122334455";
    AnsiString neu;
    
    TStringList *list = new TStringList();
    
    for(int i = 1; i <= tmp.Length(); i += 2)
    {
    	neu = "";
    	neu += tmp[i];
    	neu += tmp[i + 1];
    	list->Add(neu);
    }
    
    Label5->Caption = list->Strings[4];  //Gibt "55" aus
    

    Gibt es eine Alternative um den Code zu verkürzen? Wenn ja, wie?

    Bisher fahre ich damit eigentlich ganz gut, wobei ich das ganz gern ohne die Stringliste machen möchte. Ich habe mehrere Funktionen die das benutzen und möchte mir es so ersparen, immer wieder eine StringList machen zu müssen, alleine deshalb um den Source "sauberer" zu halten.

    Wenn jemand einen Vorschlag hat der etwas eleganter ist wäre das gut. Notfalls bleib ich bei dieser Methode da sie ja funktioniert.

    Danke im voraus!

    PS: Da mir leider kein anderer (besser passender) Threadtitel eingefallen ist hat das die Boardsuche mehr als erschwert 🙄



  • list->Add( tmp.SubString(i,2) );



  • Hallo

    Oder auf std::stringstream umsteigen, dort kannst du wie der Name schon sagt aus einem "laufenden Band" immer genau 2 zeichen auslesen. Dann must du allergings darauf achten in diesem Bereich möglichst viel mit std::string zu arbeiten und möglichst wenig in AnsiString umzuwandeln.

    bis bald
    akari



  • thomas69 schrieb:

    list->Add( tmp.SubString(i,2) );

    Danke, dass ist wirklich etwas kürzer 😃

    akari schrieb:

    Oder auf std::stringstream umsteigen, dort kannst du wie der Name schon sagt aus einem "laufenden Band" immer genau 2 zeichen auslesen.

    Und wie funktioniert das im Bezug auf mein vorhaben?
    So richtig schlau werde ich aus der Onlinehilfe nämlich nicht 😞



  • Um die TStringList zu umgehen, könntest Du doch einfach sowas schreiben:

    AnsiString tmp = "1122334455";
    int i = 4;
    Label5->Caption = tmp.SubStr(2 * i + 1, 2);
    

    Oder spricht irgendwas dagegen?

    Gruß

    Alexander



  • Alexander Kempf schrieb:

    Um die TStringList zu umgehen, könntest Du doch einfach sowas schreiben:

    der spricht irgendwas dagegen?

    Momentan nichts, gefällt mir sehr gut 🙂

    Die Zahlen vom resten Posting waren nur dazu da um zu veranschaulichen was ich meinte, da mir kein vernünftiger Threadtitel eingefallen ist. (der String ansich hat eine variable länge)

    Mit deiner Methode geht es auch, sehr gut sogar. Nur wenn ich später mal was ändere weiss ich nicht mehr was das genau macht ohne probieren zu müssen. Da ich normal nur Private was mache, gibts auch keine Sourcedoku oder Pflichtenheft 😉

    Aber ich denke, ich bleibe bei meiner bestehenden Methode, einfach, schnell und macht genau das was ich will.



  • Maverick3k schrieb:

    Nur wenn ich später mal was ändere weiss ich nicht mehr was das genau macht ohne probieren zu müssen.

    Dafür würde ich empfehlen diese Routine in eine Funktion zu verlagern, der Du dann einen aussagekräftigen
    Namen geben kannst, z.B.:

    AnsiString holeZweierBlock(AnsiString Str, int ZweierIndex) {
       return Str.SubStr(ZweierIndex * 2 + 1, 2);
    }
    

    Ich finde meinen Einzeiler deutlich einfacher zu verstehen als Deine Version mit TStringList und for-Schleife.
    Das ist aber nicht allgemeingültig für Einzeiler.

    Ehrlich gesagt habe ich bestimmt eine Minute gebraucht, um zu verstehen, was Du da eigentlich machst - und
    das trotz (oder wegen?) Deiner Erklärungen. Aber vielleicht bin ich ja auch einfach zu doof...

    Gruß

    Alexander



  • Alexander Kempf schrieb:

    Maverick3k schrieb:

    Nur wenn ich später mal was ändere weiss ich nicht mehr was das genau macht ohne probieren zu müssen.

    Dafür würde ich empfehlen diese Routine in eine Funktion zu verlagern, der Du dann einen aussagekräftigen Namen geben kannst

    Da hast du recht, kürzer gehts eigentlich nicht. Werde das wohl so machen.
    Wäre für die einzelnen Funktionen die das aufrufen sogar sinnvoller da ich mir paar Zeilen Code sparen kann und somit den Focus auf die eigentliche Funktion verlagern kann.

    Danke!

    Alexander Kempf schrieb:

    Ich finde meinen Einzeiler deutlich einfacher zu verstehen als Deine Version mit TStringList und for-Schleife. Das ist aber nicht allgemeingültig für Einzeiler.

    Ich hab bei deinem etwas länger gebraucht, aber im nachhinein war es mehr als logisch. Kommt aber wohl auch auf den Programmierstil sowie Erfahrung an.



  • Wollte nur anmerken das der kurze Code von Alex erste Sahne ist, benutze das inzwischen nur noch 🙂


Anmelden zum Antworten