Hallo zusammen, ich habe mir die gängigen AnsiString Anwendungen bereits angeschaut, für folgendes Problem aber keine simple Lösung gefunden. Ich haben z.B. einen Satz unbestimmter Länge im AnsiString. Mir scheint die Sonne aus dem Arsch. Nun möchte ich wissen wie das 3. Wort des Satzes lautet. Ausgabe soll "die" sein. Ich weiß aber nicht wie lang die vorherigen Worte sind. Kann jemand helfen? Danke schon mal an alle Tüftler da draußen. Acer
:
Verschoben durch User
AnsiString? Kling nach Borland BCB? Mit dessen Stringfunktionen wäre das komfortabel, eine direkte Funktion die das xte Wort liefert gibt es aber auch da nicht, musst du selber basteln: Zweites Leerzeichen suchen, Position Merken. Drittes Leerzeichen suchen, Position Merken. Alles zwischen 2tem und 3tem Leerzeichen in einen neuen String kopieren. Fertig.
Du musst nach dem Zeichen " " Suchen (Leerzeichen), die Anzahl mitzählen. Die Zeichen zwischen dem zweiten " " und dem " " ist dann dein drittes Wort.
Wer oder was ist ein AnsiString? Oder meinst du einen C-String. Also einen den C Konventionen nach formatierten String, mit einem \0 Zeichen am Ende, welcher zb in einem Array haust? Dann wäre zb strtok eine Möglichkeit, wenn der Satz zerstört werden darf.
Hallo, mir fällt spontan sowas wie a=s.split(' ') ein, gibt es aber leider nicht in allen Sprachen. Gruß, Michael
Also die suche nach dem 2., 3. oder 4. " " ist soweit ich weiß nicht möglich. int pos; pos = AnsiStringName.AnsiPos(" "); Zeigt mir leider nur die position des 1. " " Zeichen an :-(
Aber wohin schreibt er denn die einzeln aufgesplitteten Satzteile (Wörter)?
Acer schrieb: > Aber wohin schreibt er denn die einzeln aufgesplitteten Satzteile > (Wörter)? das wird in Hochsprachen (JAVA, .NET) wirklich oft so gemacht, split liefert dann ein array zurück. man könnte dann sogar gleich auf w = s.split(' ')[3] zugreifen. Aber in C würde ich einfach wie schon oben geschrieben zeichenweise durchgehen und die Leerzeichen suchen.
Such mal für Deine Programmiersprache nach den Wörtern "Split" "String" und "Array". So eine Split Funktion nimmt meistens ein Trennzeichen (Delimiter), in Deinem Fall das " ", einen String (Der ganze Satz) und gibt eine Liste (Array) der einzelnen Wörter zurück. Je nach Sprache ist dann das gesuchte Wort im Array Element 2 (Array beginnt bei 0) oder in Element 3 (Array beginnt bei 1).
strtok( string , " ,"); inkl. passende Schleife. Aber Vorsicht, der String wird modifiziert.
Karl Heinz Buchegger schrieb: > Wer oder was ist ein AnsiString? Das ist der String-Datentyp von Borlands C++ Compilern. > Oder meinst du einen C-String. Also einen den C Konventionen nach > formatierten String, mit einem \0 Zeichen am Ende, welcher zb in einem > Array haust? Der AnsiString ist kein C-String, die Klasse enthält aber eine Methode c_str() zur Konvertierung. Man kann also die Verarbeitung auch wie in C vornehmen.
Hi, TStringList * sl=new TStringList(); sl->Text="Mir scheint die Sonne aus dem Arsch"; String WortDrei=sl->Strings[2]; einfach genug?
Oliver R. schrieb: > Hi, > > TStringList * sl=new TStringList(); > sl->Text="Mir scheint die Sonne aus dem Arsch"; > String WortDrei=sl->Strings[2]; > > einfach genug? Das dürfte nicht funktionieren.
So schon: sl->CommaText="Mir scheint die Sonne aus dem Arsch";
das darf nicht funktionieren (immerhin ziemlich eindeutig was das *COMMA*text machen soll..) falls es um Delphi geht (AnsiString kommt eigentlich vom delphi) und man auch was lernen will könnte man sich einfach mal beispiel code anschauen (anstelle von etwas fertigem) hier mal ein nicht wahnsinnig gutes beispiel: http://www.delphitricks.com/source-code/strings/extract_words_out_of_a_string.html usw.
Hallo Robert, > das darf nicht funktionieren (immerhin ziemlich eindeutig was das > *COMMA*text machen soll..) Wie wäre es denn, es einfach mal auszuprobieren, anstatt zu schreiben, dass es nicht geht? Du wirst sehen: Es geht, da auch Leerzeichen als Trenner akzeptiert werden. > > falls es um Delphi geht (AnsiString kommt eigentlich vom delphi) > Mein Beispiel ist für den BCB, geht aber bei entsprechend anderer Syntax natürlich auch in Delphi. Gruß, Oliver
Edson schrieb: > Karl Heinz Buchegger schrieb: >> Wer oder was ist ein AnsiString? > > Das ist der String-Datentyp von Borlands C++ Compilern. > >> Oder meinst du einen C-String. Also einen den C Konventionen nach >> formatierten String, mit einem \0 Zeichen am Ende, welcher zb in einem >> Array haust? > > Der AnsiString ist kein C-String, die Klasse enthält aber eine Methode > c_str() zur Konvertierung. Man kann also die Verarbeitung auch wie in C > vornehmen. Vorsicht... c_str() liefert nur den Zeiger auf den intern verwendeten Speicher... wenn noch keiner verwendet wurde einen Zeiger auf einen leeren String... Je nach VCL-Version gibt's http://docwiki.embarcadero.com/Libraries/XE2/en/System.Classes.ExtractStrings oder mit C++ und STL/Boost http://stackoverflow.com/questions/236129/splitting-a-string-in-c
@Oliver das brauche ich nicht ausprobieren... sobald double quotes, oder comma im text vorkommen, funktioniert es nicht mehr.. das DelimitedText property könnte man eher nehmen...
Hi, > @Oliver > > das brauche ich nicht ausprobieren... Schade, denn das hätte nicht schaden können... > sobald double quotes, oder comma im text vorkommen, funktioniert es > nicht mehr.. Das stimmt so aber auch nicht. Aus der Hilfe (BCB5): "When assigning CommaText, the value is parsed as SDF formatted text. For SDF format, strings are separated by commas or spaces, and optionally enclosed in double quotes. Double quote marks that are part of the string are repeated to distinguish them from the quotes that surround the string. Spaces and commas that are not contained within double quote marks are delimiters. Two commas next to each other will indicate an empty string, but spaces that appear next to another delimiter are ignored." Natürlich gibt es 1000+X andere Tokenizer, die besser, schneller, flexibler, schöner, sicherer usw. sind. Trotzdem erfüllt die Funktion für viele Fälle ihren Zweck. Irgendwie macht es langsam keinen Spaß mehr, hier Code zu posten. Es findet sich immer jemand, der ein Haar in der Suppe findet und dann sich über den vorgeblich unperfekten Code ausläßt. Möchte nicht noch jemand schreiben, dass es bei den drei Zeilen ein Speicherloch gibt, da "delete sl" am Ende fehlt und das ganze gar nicht in einem try/__finally-Block steht oder dass man doch lieber einen auto_ptr<TStringList> verwenden sollte und und und... > > das DelimitedText property könnte man eher nehmen... das kennt mein Compiler nicht (BCB5). Gruß, Oliver
... Danke für all eure Antworten. Insbesondere an Oliver. Ich verwende ebenfalls bcb (allerdings Version 6). Ich setz mich Freitag wieder ran und gebe dann mal feedback. Acer
(vorher vielleicht mal genauer definieren, was du unter "wort" verstehst..) was ist mit Punkten, Beistrichen, Fragezeichen, Anführungszeichen usw.
Eigentlich handelt es sich bei meinem Projekt um eine Temperatursteuerung. Da mich die Frage allerdings allgemein interessiert hat, habe ich dies auch so geschildert. In meinem Fall will ich Zahlen + Buchstaben für Zeit oder Temperatur an einen Mikrocontroller übertragen. z.B. m=minuten t=Temperatur 0m 0t 60m 100t 120m 200t 180m 300t 240 400t 700m 1000t Ich bin mir bewusst, dass dies nicht exakt dem geschilderten Fall entspricht. Hoffte so allerdings mehr Anregungen und Tipps zu erhalte, die ggf. auch von anderen genutzt werden können.
anno dazumal war mal "binär" modern... dann kam fixe feldlänge dann varible (also ungefähr das was du machst) inzwischen nimmt man XML ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.