ansistring berbeiten bzw. vor einem zeichen abschneiden
-
hallo @ll!
ich habe einen string vom tüpp AnsiString. Ich benutze den Borland C++ Builder 5 also auf Ansi C++ basierend.
jetzt möchte ich einen String, der folgender maßen aussieht beschneiden:
"Mustermann, Max #12"Ich habe eine Datei die nach einem struct abgebildet ist, für den vornamen und den nachnamen sind jeweils 20 bytes reserviert und doch wegen dem ", " im string haben wir ingesamt 42 zeichen länge des strings. jetzt ist an der 43ten stelle immer eine raute "#". alles was nach der raute steht möchte ich gerne in eine INTEGER variable einlesen, sodass da dann z.B. 12 drinne steht.
wie geht das?
vielen dank!gruß
mike
-
Hallo
- das gehört ins Builder-Forum, da AnsiString eine VCL-Klasse ist
- hier findest du u.a. eine Übersicht über die Methoden von AnsiString, mit denen du den Inhalt bearbeiten kannstbis bald
akari
-
vielen dank!
ich benutze jetzt die methode STRING.delete(1,43) um mir die zahl ausgeben zu lassen. sobald ich den ansistring dann aber mit ToInt() nach Integer konvertieren möchte, kommt eine fehlermeldung dass "'12" keine gültige Integer zahl wäre.
wieso hängt der ein HOCHKOMMA vor den String?mache ich da was falsch?
-
Hallo
das kann nur daran liegen, das das Hochkomma bereits im String drin ist. Geh mal mit dem Debugger deine Verarbeitungsfunktion durch und las dir bei jedem Schritt den Wert des besagten AnsiStrings anzeigen, dann weißt du wo das Hochkomma herkommt.
bis bald
akari
-
das ist ja das problem...
das hochkomma kommt definitv nicht in dem string vor. ich weiß nicht warum!wenn ich es schritt für schritt durchgehe taucht das hochkomma nicht auf erst ab der delete methode wird es vor den übrigen zeichen hinzugefügt.
sehr strange die sache.
-
Hallo
da wir nicht raten können : zeig doch mal den entsprechenden Code-Ausschnitt sowie den Inhalt des AnsiStrings, mit dem du das testest.
Ich kann dir versichern das Delete keine Zeichen hinzufügt.bis bald
akari
-
AnsiString = "Mustermann, Max #0"
AnsiString text; int dataPos = 0; text = ListView1->Items->Text; text = text.Delete(1,43); dataPos = text.ToInt(); ShowMessage(dataPos);
-
Hallo
du löscht du ersten 43 Buchstaben des AnsiStrings, obwohl ja überhaupt garnicht soviele drin sind. Deshalb wird der text leer. Von einem Hochkomma sehe ich nichts, die Exception deutet nur den leeren String an.
du kannst die Position dynmaisch herausfinden
int Pos = text.Pos("#"); text = text.Delete(1,Pos);
bis bald
akari
-
das liegt daran, dass ich nicht so viele leerzeichen posten kann hier ^^
aber das tut auch nicht, habe es getestet. ich weiß nicht wieso da ein hochkomma gesetzt wird und das ist DEFINITIV. möchte dich nicht veräppeln, oder so...
liegts eventuell am builder? das der mal wieder spinnt?hier eine andere methode was mir ein freund zugeschickt hat, da kommt bei mir ein zugriffsfehler auf den speicher:
AnsiString temp1 = ""; char *temp2 = ""; temp1 = list_items->Items->Text; strcpy(temp2, temp1.SubString(44,temp1.Length() - 1).c_str()); int test = atoi(temp2);
bei ihm wird auch ein hochkomma gesetzt...
-
hab die lösung!
in den letzten beiden zeichen nach der 0 stand noch müll drinne... wenn ich also die length() - 2 nehme dann geht das ganze.vielen dank für deine hilfe.
gruß
mike
-
Hallo
aber das tut auch nicht, habe es getestet.
Das ist keine sehr ausführliche Fehlerbeschreibung...
Mitint Pos = text.Pos("#"); text = text.Delete(1,Pos);
schneidest du auf jedenfall alles vor der Raute (mitsamt Raute) ab.
Das heißt solange du nach der Raute ausschließlich eine gültige Zahl hast, wird die Fehlerfrei konvertiert.
Mach mal zur Überprüfung das hierint Pos = text.Pos("#"); text = text.Delete(1,Pos); try { dataPos = text.ToInt(); } catch(...) { ShowMessage("Keine gültige Zahl : " + text); }
Ach und nimm lieber nicht den C-Style Code. Das läßt sich wirklich besser mit VCL-Sachen machen, wenn du dir erstmal über deine Daten im Klaren bist.
bis bald
akari