Strings Zerlegen

  • Strings Zerlegen

    Hallo Leute!
    Ich habe da mal wieder eine Frage:
    Ich habe einen String (z.B. "c_red|c_yellow|c_green")
    Und ich möchte diesen String jetzt an dem "|" so zerlegen:

    str[0]="c_red";
    str[1]="c_yellow";
    str[2]="c_green";

    Ich hatte das schon wie folgt versucht, aber dann hängt das Game sich auf oder es funktioniert gar nicht erst.
    Wichtig:
    Der String kann dieses "|" nur 2mal enthalten.
    Das heißt es können maximal 3 Wörter (hier Farben) rauskommen.

    cut_string(string,max,index);
    Spoiler anzeigen

    GML-Quellcode

    1. /*
    2. cut_string(string,max,index);
    3. string: der text
    4. max: die maximale Anzahl an Wörtern (0-2)
    5. index: das gewünschte Wort (0-2)
    6. --> 0: 1. Wort
    7. 1: 2. Wort
    8. 2: 3. Wort
    9. */
    10. ind=argument2;
    11. max_str=argument1;
    12. i=0;
    13. ii=0;
    14. xx=0; //startposition
    15. repeat(max_str+1)
    16. {
    17. //wiederholt das verfahren so oft, wie viele wörter entstehen können
    18. do
    19. {
    20. i+=1;
    21. } until (string_char_at(argument0,xx+i)="|") or (xx+i>=string_length(argument0))
    22. //bis ein "|" oder das ende erreicht ist
    23. //"erstellt" die Wörter:
    24. if =0
    25. {
    26. //sonst ist hier ein buchstabe zu viel
    27. str[0]=string_copy(argument0,xx,i-1);
    28. xx+=i-1;
    29. }
    30. if =1
    31. {
    32. str[1]=string_copy(argument0,xx,i);
    33. xx+=i;
    34. //springt zur aktuellen position
    35. }
    36. if =2
    37. {
    38. // sonst ist hier ein buchstabe zu wenig
    39. str[2]=string_copy(argument0,xx,i+1);
    40. xx+=i+1;
    41. }
    42. ii+=1; //zählt das aktuelle wort
    43. i=0;
    44. //stellt die länge zurück
    45. }
    46. return str[ind];
    47. //gibt den gewünschten String zurück
    Alles anzeigen


    Aufgerufen wird das dann so:

    GML-Quellcode

    1. cut_string("c_red|c_yellow|c_green",2,1);
    2. //das würde jetzt eigendlich "c_yellow" ausgeben

    Aber leider hängt sich das Spiel auf.

    Danke schon mal im Vorraus

    -Tobi
  • Da hab ich mir ein nützliches kleines Skript geschrieben (Ich hoffe zumindest, dass es auch wirklich von mir ist xD :(

    GML-Quellcode

    1. //argument0 = string, argument1 = partnr, argument2 = teiler
    2. if (argument1==1)
    3. {
    4. return string_copy(argument0,1,string_pos(argument2,argument0)-1);
    5. }
    6. else
    7. {
    8. while(argument1>1)
    9. {
    10. argument0=string_delete(argument0,1,string_pos(argument2,argument0));
    11. argument1-=1;
    12. }
    13. return string_copy(argument0,1,string_pos(argument2,argument0)-1);
    14. }
    Alles anzeigen


    Da können dann auch mehrere Teile drin sein.
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • GML-Quellcode

    1. x_pos=string_pos('|',str)
    2. xtemp=real(string_copy(str,1,x_pos-1))
    3. str=string_delete(str,1,x_pos)
    4. y_pos=string_pos('|',str)
    5. ytemp=real(string_copy(str,1,y_pos-1))
    6. str=string_delete(str,1,y_pos)
    7. ctrl_pos=string_pos('|',str)
    8. ctrl=real(string_copy(str,1,ctrl_pos-1))
    9. str=string_delete(str,1,ctrl_pos)
    10. ...
    11. und so weiter
    Alles anzeigen


    Ein Beispiel wie ich das immer löse. Sollte eigentlich funktionieren.

    © 2008 by Teamgrill Productions
  • Danke schonmal.

    Also:
    Spellmaker's Vorschlag ist doch schon mal gar nicht so schlecht ^^
    Das Problem ist nur das:
    (cut_string enthält seinen code)

    GML-Quellcode

    1. cut_string("was geht|hallo|tschuess",0,"|"); //Beispiel
    2. cut_string("was geht|hallo|tschuess",1,"|"); //Beispiel
    3. cut_string("was geht|hallo|tschuess",2,"|"); //Beispiel


    raus kommt dann aber nicht für das erste "was geht", für das zweite "hallo" und für das dritte "tschuess", sondern
    für das erste "was geht" für das zweite "was geht" und für das dritte "hallo".

    MasterXY's werde ich noch versuchen zu optimieren.


    Ja, ich habe heute einen schlechten Tag.
  • Tobi schrieb:

    Danke schonmal.

    Also:
    Spellmaker's Vorschlag ist doch schon mal gar nicht so schlecht ^^
    Das Problem ist nur das:
    (cut_string enthält seinen code)

    GML-Quellcode

    1. cut_string("was geht|hallo|tschuess",0,"|"); //Beispiel
    2. cut_string("was geht|hallo|tschuess",1,"|"); //Beispiel
    3. cut_string("was geht|hallo|tschuess",2,"|"); //Beispiel


    raus kommt dann aber nicht für das erste "was geht", für das zweite "hallo" und für das dritte "tschuess", sondern
    für das erste "was geht" für das zweite "was geht" und für das dritte "hallo".


    Das liegt daran, dass Spellmaker bei 1 anfängt zu zählen, und nicht bei 0, wie man leicht sieht, wenn man sich den Code mal anschaut, anstatt ihn nur zu kopieren.
    Dies korrigiert man leicht, indem man nur den Teil aus dem else-Block verwendet und den Rest weglässt.
  • Ja ok danke!
    Aber ich war gestern richtig schlecht drauf und hab das deswegen auch nicht bemerkt..
    Ich werd mich da jetzt mal eine halbe Stunde dran setzten.
    Ich meld mich dann wieder heute abend.

    Ah ich bin dumm ^^
    Ich wusste nicht das ans Ende des strings das trennzeichen auch noch dran muss..
    also
    so:
    cut_string("was geht|hallo|tschuess|",0,"|"); //Beispiel

    DANKE FÜR EURE HILFE! :thumbsup: :thumbsup:

    -Tobi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Tobi ()

  • Benutzer online 1

    1 Besucher