Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 13.04.2005, 15:38 Titel: Alle Wörter eines Strings in ein Array? |
|
|
Ich habe wieder mal ne Frage; dessen Lösung ich schon seit Vorgestern Abend suche:
Angenommen ich hätte einen String, dessen Inhalt zum Beispiel "Das ist ein Satz mit Wörtern." ist. Wie kann ich jetzt alle Wörter in ein Array/Feld platzieren, so das jedes Wort ein Feld ist also:
String(0) = Das
String(1) = ist
String(2) = ein
String(3) = Satz
String(4) = mit
String(5) = Wörtern.
Also so, dass es nach jeden Leerzeichen (evtl. auch jedes CHR$(13) Zeichen) ein Array anlegt und und diesem ein Wort zuordnet. Die Wörter könnte ja man sicher mit irgendwie INSTR und MID$ Trennen, aber wie zum Teufel bring ich das in ein Feld...
Vieleicht ist es noch erwähnenswert, dass der String in meinem Fall max 119 Zeichen lang ist (aber natürlich auch weniger)...
Danke im vorraus |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 13.04.2005, 15:47 Titel: |
|
|
Das ist gar nicht so schwer.
Zunächst brauchst du die Anzahl der Leerzeichen. Bei einem Satz mit 3 Leerzeichen sollte man meinen, dass es dort 4 Wörter gibt. (Überhaupt muss man hier von Leerzeichenausnahmen absehen.)
satz$ = "Dies ist ein Satz"
also erst mal ein Array mit 4 Feldern machen
DIM wort$(4)
Dann sollte so etwas in der Art folgen: Die Wörtersuche
w$ = ""
w% = 0
FOR i% = 1 TO LEN(satz$)
IF MID$(satz$, i%, 1) = " " THEN
w% = w% + 1
wort$(w%) = w$
ELSE
w$ = w$ + MID$(satz$, i%, 1)
NEXT i%
(nicht getestet, aber könnte klappen)
In der IF-Abfrage kann man das Trennzeichnen festlegen. Und solange, der Satz nicht mit einem Leerzeichen beginnt, oder sonstige Ausnamen vorhanden sind, sollte es klappen. _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.04.2005, 15:57 Titel: |
|
|
Hallo
Das funktioniert. Ich hatte gerade ein identisches Programm geschrieben und getestet, war aber zu langsam... Deshalb möchte ich nur noch anmerken, dass 119 Zeichen durch 59 Leerstellen in maximal 60 Teile getrennt werden können.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 13.04.2005, 15:58 Titel: |
|
|
danke, aber ich weiss lieder nicht, wieviele wörter bzw. leerzeichen in diesem String sein werden
Und nen Array mit 60 Feldern anlegen ist auch nicht das gelbe vom ei
PS: Mehrere Leerzeichen sollten wie eines behandelt werden, sonst gibt es wieder probleme  |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.04.2005, 16:13 Titel: |
|
|
Hallo
Das hier zählt die Worte auch bei mehreren Leerstellen richtig:
Code: | CLS
DIM wort$(59)
satz$ = " Das ist ein Satz mit Woertern"
nummer = 0
pause = 0
FOR z = 1 TO LEN(satz$)
z$ = MID$(satz$, z, 1)
IF z$ <> CHR$(32) THEN
wort$(nummer) = wort$(nummer) + z$
pause = 1
ELSE
nummer = nummer + pause
pause = 0
END IF
NEXT
FOR a = 0 TO nummer
PRINT wort$(a)
NEXT |
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 13.04.2005, 16:29 Titel: |
|
|
Hey, danke, das funktioniert ja schon sehr gut...
Hat aber jemand noch eine Idee, wie ich das Array verkleinern kann. 59 Felder fressen extrem viel Speicher...
Gibt es da keine schönere Möglichkeit? |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.04.2005, 16:39 Titel: |
|
|
Hallo
Du kannst ja das passende Wort immer erst dann aus dem Satz herausschneiden, wenn du es brauchst ohne es in einem Array zwischenzuspeichern. Dann brauchst du dir höchstens jedesmal zu merken, wieviele Worte schon herausgelesen wurden und holst dir beim folgenden Durchlauf das nächste.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 13.04.2005, 18:18 Titel: |
|
|
Oder du legst das Array (per BSAVE?) in eine externe Datei ab.
So kannst du den Speicher anders nutzen, und musst nur kurz für einen Zugriff die Datei laden.
Wenn du aber ziemlich oft auf dein Array zugreifen musst/willst, ist das allerdings eine recht zeitfressende Methode...
Wenn dir wirklich der Speicher ausgehen sollte, versuchs doch einfach mit EMS! Der wird ja von QBX unterstützt! (oder wars XMS? Ich kann sowiso mit keinem von beiden arbeiten... Aber dein Speicherproblem wäre gelöst) _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 13.04.2005, 19:17 Titel: |
|
|
Leider auch nicht genau das was ich wollte..
Wie müsste ich es denn per Funktion machen?
So das ich nen String und den Wert n, und ich erhalte als Rückgabewert das n. Wort von String... |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 14.04.2005, 09:08 Titel: |
|
|
Code: |
satz$ = " Dies ist ein komischer Satz mit vielen Leerzeichen . "
trenn$ = " "
Print "*" + satz$ + "*"
Dim wort$(50)
w$ = ""
n = 0
For i = 1 To Len(satz$)
z$ = Mid$(satz$, i, 1)
If z$ <> trenn$ Then
w$ = w$ + z$
Else
If w$ <> "" Then
n = n + 1
wort$(n) = w$
w$ = ""
End If
End If
Next
Print "---"
For i = 1 To n
Print "wort$(" + Str$(i) + ") = " + Chr$(34) + wort$(i) + Chr$(34)
Next
End
|
ist zwar mit Blitzbasic geschrieben, sollte aber kompatibel sein.
Code: |
FUNCTION nwort$ ( satz$, pos1)
trenn$ = " "
w$ = ""
n = 0
For i = 1 To Len(satz$)
z$ = Mid$(satz$, i, 1)
If z$ <> trenn$ Then
w$ = w$ + z$
Else
If w$ <> "" Then
n = n + 1
if n = pos1 THEN nwort$ = w$
w$ = ""
End If
End If
Next
END FUNCTION
|
so sollte es als FUNCTION aussehen _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 15.04.2005, 17:59 Titel: |
|
|
PERFEKT!
Danke vielmals, genau das, was ich wollte (war schon dabei eine eigene Funktion zu schreiben, aber hatte etliche Probleme damit) |
|
Nach oben |
|
 |
|