Xtes Wort aus AnsiString auslesen

Gast #2948280
Lesenswert?

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
Gast #2948283
Lesenswert?

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.
Gast #2948358
Lesenswert?

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.
Gast #2948359
Lesenswert?

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).
Gast #2948389
Lesenswert?

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.
#2950493
Lesenswert?

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.
#2950519
Lesenswert?

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
#2950741
Lesenswert?

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
#2951476
Lesenswert?

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
Gast #2953718
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren