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
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.
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.
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 :-(
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).
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.
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.
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
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.