Forum: PC-Programmierung Xtes Wort aus AnsiString auslesen


von Acer (Gast)


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

: Verschoben durch User
von Steel (Gast)


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.

von Martin (Gast)


Lesenswert?

Du musst nach dem Zeichen " " Suchen (Leerzeichen), die Anzahl 
mitzählen. Die Zeichen zwischen dem zweiten " " und dem " " ist dann 
dein drittes Wort.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael A. (micha54)


Lesenswert?

Hallo,

mir fällt spontan sowas wie a=s.split(' ') ein, gibt es aber leider 
nicht in allen Sprachen.

Gruß,
Michael

von Acer (Gast)


Lesenswert?

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

von Acer (Gast)


Lesenswert?

Aber wohin schreibt er denn die einzeln aufgesplitteten Satzteile 
(Wörter)?

von Peter II (Gast)


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.

von blinky (Gast)


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

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

strtok( string , " ,");
inkl. passende Schleife.
Aber Vorsicht, der String wird modifiziert.

von Edson (Gast)


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.

von Oliver R. (superberti)


Lesenswert?

Hi,

TStringList * sl=new TStringList();
sl->Text="Mir scheint die Sonne aus dem Arsch";
String WortDrei=sl->Strings[2];

einfach genug?

von Steel (Gast)


Lesenswert?

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.

von Oliver R. (superberti)


Lesenswert?

So schon:

sl->CommaText="Mir scheint die Sonne aus dem Arsch";

von Robert L. (lrlr)


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.

von Oliver R. (superberti)


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

von Arc N. (arc)


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

von Robert L. (lrlr)


Lesenswert?

@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...

von Oliver R. (superberti)


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

von Acer (Gast)


Lesenswert?

...
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

von Robert L. (lrlr)


Lesenswert?

(vorher vielleicht mal genauer definieren, was du unter "wort" 
verstehst..)

was ist mit Punkten, Beistrichen, Fragezeichen, Anführungszeichen usw.

von Acer (Gast)


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.

von Robert L. (lrlr)


Lesenswert?

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
Noch kein Account? Hier anmelden.