AnsiString schneiden die 2te



  • Hallo,
    auch ich habe ein Problem mit AnsiString.
    Hier der Code:

    int i, iStart, iEnd;
    	bool qServerRPL = false; //is it a server-reply or is it like a privmsg from a user?
    	if(tMsg[1] != ':') //not a server msg
    		return;
    
    	//get the prefix
    	iStart = 1;
    	for(i = iStart; i < tMsg.Length(); i++)
    		if(tMsg[i] == ' ')
    		{
    			iEnd = i;
    			break;
    		}
    	stPrefix.tCompleteString = tMsg.SubString(iStart, iEnd-1);
    	iStart = iEnd+1;
    
    	if(stPrefix.tCompleteString != Form1->EditNick->Text)
    		qServerRPL = true;
    
    	//get the command
    	for(i = iStart; i < (i+3); i++)
    		if(tMsg[i] == ' ')
    		{
                AnsiString test = tMsg.SubString(i, i+3);
    			iEnd = i;
    			break;
    		}
    	stCommand.tCompleteString = tMsg.SubString(iStart, iEnd-1);
    	iStart = iEnd+1;
    

    das problem hier ist jetzt, das in stCommand.tCompleteString nicht wie erwartet die 3 Zahlen stehen, sondern "001 slackbot :Welcome to the euI" - ich hatte vorher auch in der for-Schleife for(i = iStart; i < tMsg.Length(); i++) - jetzt hab ichs mit (i+3) gemacht, trotzdem das gleiche...

    LG

    Oli



  • Um an deine Fragestellung zu kommen, muss ich erst das Programm analysieren??

    Wäre ja besser zu wissen:

    Wie sieht der Ausgangsstring aus?
    Was soll nach welcher Regel rauskommen?

    Zumal es nicht so aussieht, als ob diese Routine von dir kommt?
    Was soll sie bewirken?



  • Hi,

    also, die routine kommt von mir.

    ich kriege einen String vom irc server, zb.:
    :irc.de.euirc.net 001 slackbot :Welcome to the euIRC network user!@host...blabla

    jetzt muss ich den string halt zerschneiden, ich will eigentlich im ersten string das :irc.de.euirc.net, im 2ten das 001, und spaeter muss der rest auch noch eingebaut werden...

    stPrefix.tCompleteString = tMsg.SubString(iStart, iEnd-1);
    das passt, hier steht dann in stPrefix.tCompleteString ":irc.de.euirc.net"

    in stCommand.tCompleteString sollte eigentlich "001" stehen, tuts aber nicht

    in stCommand.tCompleteString nicht wie erwartet die 3 Zahlen stehen, sondern "001 slackbot :Welcome to the euI" -

    ich finde der rest ist ziemlich selbst erklaerend...
    ist einfach ein rumschneiden von AnsiStrings, ich teste halt einfach ob ein 0x20 auftaucht, wenn ja ist der naechste block dran.

    lg

    Oli



  • Dann sollte dir das helfen:
    http://www.marquardtnet.info/cecke/quickies.1/1_quicky_01.html

    Des Weiteren kommt dein entscheidener Hinweis erst im letzten Satz:

    ich teste halt einfach ob ein 0x20 auftaucht, wenn ja ist der naechste block dran.

    Die Frage wäre doch einfach gewesen: Wie teile ich eine String an Leerzeichen auf?

    Und selbterklärend?? Sorry was hat "//get the prefix" mit der Suche nach einem Leerzeichen zu tun? Ein Prefix ist aber etwas anderes



  • prefix = servername / ( nickname [ [ "!" user ] "@" host ] )
    so stehts im rfc, welches ich nicht geschrieben habe. und nach dem prefix folgt ein "SPACE".

    "Die Frage wäre doch einfach gewesen: Wie teile ich eine String an Leerzeichen auf?"
    nein, denn im ersten run funzt es, im 2ten nicht.
    ausserdem soll nicht nur nach leerzeichen getestet werden was hier aber jetzt keine rolle spielt.

    der link hilft mir nicht da ich nicht nur nach leerzeichen suchen kann - desweiteren will ich keine zuordnung in eine tstringlist.
    so wie es dort steht mit if(blah[n] == ' ') muss es gehen - warum es das nur im ersten run tut weiss ich nicht, das wuerde ich gerne wissen.

    lg

    oli



  • der link hilft mir nicht da ich nicht nur nach leerzeichen suchen kann

    Brauchst du auch nicht, wo steht da, dass es nur mit Leerzeichen geht?

    Das ist ein Beispiel. Ich habe das Beispiel nun nicht mit jedem Zeichen gemacht. Des Weiteren funktioniert die Rountine auch mit einem Delimiter wie "123"; es kann also ein längerer Trenner vorgegebne werden.

    Warum keine TStringlist? Ggf. ist es einfacher den Ausgangsstring mehrfach zu splitten und sich aus der Stringlist nur die beötigten Teile zu holen.

    Aber warum einfach, wenn es auch kompliziert geht 😉

    Ein rfc ist ein Request for Comment. Dort wird ein Vorgang abstrakt beschrieben.



  • ist ganz einfach - du liest

    SubString(i,i+3)
    

    aus - aber SubString gibt dir nicht die Zeichen VON i BIS i+3 zurück, sondern ANFANGEND BEI i gibt es dir DIE NÄCHSTEN i+3 zeichen - der zweite parameter gibt nämlich nicht die obere grenze der schleife, sondern die anzahl der zeichen an, also kriegst du hier die zeichen i bis i**+i**+3...

    mach mal so:

    AnsiString test = tMsg.SubString(i, 3);
    

    beim anderen aufruf kriegste das gleiche problem (vielleicht auch nicht, wenns nur am anfang des Strings aufgerufen wird - aber aus gründen der korrektheit:

    stPrefix.tCompleteString = tMsg.SubString(iStart, iEnd-iStart);
    

    oder benutz einfach diese Funktion, die ich mal grad zusammen gebastelt hab (und getestet, was hier viele nicht machen ^^)

    AnsiString SubString_Von_Bis(const AnsiString& str, int von, int bis)
       {
       return(str.SubString(von,bis-von+1));
       }
    

    das gibt dir die zeichen von "von" bis "bis" (einschließlich) ^^
    MfG

    AlgoMan



  • Hallo,

    das AnsiString test war nur zum gucken wo er sich befindet - bitte ignorieren.

    Beim debuggen krieg ich im 2ten String raus:

    AnsiString.SubString(22, 26) -> absolut richtig, trotzdem schneidet er es nicht so wie es sein soll.
    Ich werds jetzt mit den standard c Funktionen machen, obwohl ich eigentlich alles in Klassen machen wollte zum Lernen. string.h liefert da ja alles noetige.
    Sollte jemand den Fehler finden, (der nicht am SubString selbst liegen kann, denn der Debugger gibt die richtigen Zahlen an), bin fuer jeden Tipp dankbar.

    lg

    Oli



  • Oli21 schrieb:

    AnsiString.SubString(22, 26) -> absolut richtig, trotzdem schneidet er es nicht so wie es sein soll.

    was soll er den schneiden und wa schneidet er?

    AnsiString asText = asText.SubString(22, 26);
    

    würde aus dem String asText ab dem 22. Zeichen 26 zeichen ausschneiden und in asText Speichern. (also von zeichen 22 bis und mit 47)

    mfg
    BigNeal



  • Das ganze scheitert daran, dass nciht beschrieben werden kann, was wann wie erfolgen soll.

    Das dies

    :irc.de.euirc.net 001 slackbot :Welcome to the euIRC network user!@host...blabla

    Der Ausgangsstring ist, konnte geklärt werden, aber nicht was generell auskommen soll.

    Einmal soll nach Leerzeichen gesucht werden um '001' raus zu bekommmen, mal spielt es keine Rolle.

    Entweder es gibt hier eine oder mehrere Regeln mit denen das gewünschte Ergebnis (was bisher noch so richtig keiner kennt) erzielt werden kann oder nicht. Wenn nicht ist halt der String mit ganz normaler Stringverarbeitung im "Einzelfall" zu lösen.

    Das Verlagern auf eine andere Technik (C-Funktionen) löst keine Logik- oder Konzeptprobleme. Die Klasse String hat fast alles was man braucht. Für den Rest (splitten) gab es Links. Was sollen C-Funktionen also bringen?

    AnsiString.SubString(22, 26) -> absolut richtig, trotzdem schneidet er es nicht so wie es sein soll.

    Wenn er das nicht so macht wie er soll, liegt das an falschen Anweisungen.



  • Also nochmal...

    ich erhalte vom IRC Server eine Message die ich in einem AnsiString speichere.
    Für das genaue aufsplitten (was ich hier nicht erklaeren werde) bitte rfc lesen - das ist mir einfach zuviel.
    Fuer mich ist jetzt einfach nur wichtig wieso er nicht die 3 Zeichen (4 mit dem " ") rausschneidet, obwohl es der debugger richtig anzeigt.
    In C funktioniert es, und das ist was fuer mich wichtig ist.

    Es kann generell alles moegliche rauskommen, je nachdem ob client-msg, server-msg, unknown-msg etc.

    Einmal soll nach Leerzeichen gesucht werden um '001' raus zu bekommmen, mal spielt es keine Rolle.

    es spielt alles eine Rolle, aber vorerst ist nur die Serverantwort (die 001 - das command) wichtig, damit ich weiter machen kann.

    Entweder es gibt hier eine oder mehrere Regeln mit denen das gewünschte Ergebnis (was bisher noch so richtig keiner kennt) erzielt werden kann oder nicht.

    bitte rfc lesen - aufsplitten damit ich jede moegliche Serverantwort verarbeiten und entsprechen ausgeben kann.

    Wenn er das nicht so macht wie er soll, liegt das an falschen Anweisungen.

    was denn fuer Anweisungen?

    lg

    Oli



  • (was ich hier nicht erklaeren werde) bitte rfc lesen - das ist mir einfach zuviel.

    Sorry, aber du hast das Problem, wenn du es nicht mal in Worte fassen kannst.... Auch nicht mal die rfc Nummer angegeben. Soll man jetzt alle durchsuchen??

    Hier kriegst du deine Zahl, egal wieviel Text davor ist, Hauptsache die Zahl ist durch ein Space vom dem Text davor getrennt.

    String test=":irc.de.euirc.net 001 slackbot :Welcome to the euIRC network user!@host...blabla ";
    TStringList *liste=new TStringList();
    split(liste,test," ");
    String zahl=liste->Strings[1];
    delete liste;
    

    was denn fuer Anweisungen?

    Solltest du eigentlich schon in den ersten Minuten beim programmieren gelernt haben. Wenn das

    AnsiString.SubString(22, 26)

    nicht funktioniert, liegt es an einer falschen Anweisung. Der Computer macht kaum Fehler



  • http://www.irchelp.org/irchelp/rfc/rfc2812.txt

    na soviele rfc's ueber das irc protocol gibts nicht.
    und jetzt kurz in worte gefasst: mir ist scheiss egal wie es sonst geht (gibt mio. moeglichkeiten), ich habs in c geloest und es funktioniert einwandfrei.
    sollte jemand wissen wieso das mit der klasse ansistring nicht funktioniert, bin fuer jeden tipp dankbar.

    http://olze.ath.cx/debug.JPG
    hier ein screenshot, links stehen die local variables, wo man iEnd und iStart sehen kann. Das hint zeigt den Inhalt der Variablen.

    Sorry, aber du hast das Problem, wenn du es nicht mal in Worte fassen kannst.... Auch nicht mal die rfc Nummer angegeben. Soll man jetzt alle durchsuchen??

    keiner zwingt dich mir zu helfen, also lass es doch wenn es dich aufregt?

    Solltest du eigentlich schon in den ersten Minuten beim programmieren gelernt haben.

    Na wenn du so ein god-like-programmer bist dann kannste mir ja genau sagen warum es _genau_ so nicht geht?

    lg

    oli



  • Reichlich unverschämter Ton für nen Bittsteller, meinst du nicht, Oli? Wo sollte denn da die Motivation liegen dir zu Helfen?

    Ich erklärs dir mal:
    DU als Fragesteller bist in einer Bringschuld. Es ist deine Aufgabe, die Leute mit Informationen zu versorgen.

    Ich könnte jetzt mal im gleichen Stil antworten wie du: Du benutzt SubString falsch. Was genau es ist, bitte Borland Hilfe konsultieren. Ist einfach zuviel.

    Und bevor du jetzt nen dicken Hals kriegst, schlucks nochmal runter und denk drüber nach... ok?



  • Du benutzt SubString falsch.

    Das ist dir schon mehrfach hier erklärt worden

    ich habs in c geloest und es funktioniert

    Wo hast du da C benutzt?? Im Screenshot nix zu sehen.

    Na wenn du so ein god-like-programmer bist dann kannste mir ja genau sagen warum es _genau_ so nicht geht?

    Ganz ehrlich-> könnt ich bestimmt, aber ich habe keine Lust so ein verwurschtelten Code durchzugehen, ohne zu wissen was bei dabei rauskommen soll. Des Weiteren ist die von mir gezeigt Lösung um etliches kürzer.



  • Hallo,

    danke fuer die Antwort und sorry fuer den "unverschaemten Ton"; ich krieg sicher keinen dicken Hals.

    "Ich könnte jetzt mal im gleichen Stil antworten wie du: Du benutzt SubString falsch. Was genau es ist, bitte Borland Hilfe konsultieren. Ist einfach zuviel."
    Mehr wollte ich eigentlich auch nicht hoeren - haette ja sein koennen das jemand auf anhieb sieht wo das Problem ist.



  • Na is doch klar das im Screenshot nix zu sehen ist, will ja wissen warum es so mit AnsiString nicht geht.

    Ganz ehrlich-> könnt ich bestimmt, aber ich habe keine Lust so ein verwurschtelten Code durchzugehen, ohne zu wissen was bei dabei rauskommen soll.

    hab ich jetzt wohl schon oft genug erklaert... weiss nicht wie ich es noch erklaeren soll damit du mich verstehst.



  • Ganz langsam:

    Das ist der String

    String test=":irc.de.euirc.net 001 slackbot :Welcome to the euIRC network user!@host...blabla ";

    Was willst du daraus haben?



  • ok also,

    stPrefix.tCompleteString <- hier soll :irc.de.euirc.net rein
    stCommand.tCompleteString <- hier soll 001 rein

    das wars auch schon 😉

    lg

    Oli



  • dan öffne mal die BCB-Hilfe

    lies mal unter AnsiString nach, was diese Klasse alles kann.
    spezielle aufmerksamkeit kannst du auf AnsiString::Pos() und AnsiString::SubString() werfen

    sorry, aber mit solchen sachen muss man lernen klarzukommen..
    wenn du etwas spezielles aus der hilfe nicht verstehst, frag konkret danach

    mfg
    BigNeal


Anmelden zum Antworten