strlen wird ignoriert

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo, ich habe folgendes Problem:
    Ich will einen Text auf 64 Zeichen limitieren.
    Allerdings wird "strlen" dabei vollkommen ignoriert...


    Mein Code:
    new text[64];
    if(sscanf(params, "s[64]", text))return SendClientMessage(playerid, COLOR_WHITE, "/test [Text (Maximal 64 Zeichen)]");
    if(strlen(text) > 64)return SendClientMessageEx(playerid, COLOR_WHITE, "%d Zeichen.", strlen(text));
    //Weiterer Code


    In der Konsole kommt auch die Warnung "sscanf warning: String buffer overflow.".


    Hat jemand eine Idee wie man das Problem lösen kann?

  • Habe das Problem gelöst.
    Der String muss ein größer sein als wie man es mit strlen prüft.
    Limitiert man den String auf 64, geht strlen nur bis 63.

  • Deine Abfrage brauchst du nicht , falls du das sscanf plugin nutzst was ich dir empfehle
    wird der string der an text weiter gegeben wird automatisch auf die länge gekürzt. Durch sie angabe der länge des Strings soll genau sowas beim durch das Plugin verhindert werden.


    sollte sich die Funktion sscanf im skript befinden bitte rausnehmen.

  • Deine Abfrage brauchst du nicht , falls du das sscanf plugin nutzst was ich dir empfehle
    wird der string der an text weiter gegeben wird automatisch auf die länge gekürzt. Durch sie angabe der länge des Strings soll genau sowas beim durch das Plugin verhindert werden.


    sollte sich die Funktion sscanf im skript befinden bitte rausnehmen.


    Ich nutze das Plugin, aber selbst kürzen? Nein, macht er bei mir nicht. :D

  • Das ist ja das komische... "text" ist nur 64 Zeichen lang, trotzdem kann ich z.b. einen 70er String ausgeben lassen. In der Konsole kommt nur der besagte Warning.
    Irgendwas stimmt hier nicht. :pinch:


    /edit: Ja, sscanf 2.8.2.

  • Mal kurz nebenbei, es ist total redundant hier sscanf zu nutzen, schreibe es einfach so:


    if(strlen(params) > 64)return SendClientMessageEx(playerid, COLOR_WHITE, "%d Zeichen.", strlen(params));
    //Und text = params...


    Doch du kannst keine 128 Zeichen in einen string packen der auf 64 Zeichen limitiert ist


    Nun, ich weiß nicht genau wie das verarbeitet ist...aber es kann doch gut sein, dass das NULL Byte überschrieben wird...somit kann der String dadurch natürlich größer werden...


    Naja, wie dem auch, es ist in der Doku beschrieben, dass man sscanf nicht nutzen soll für diesen Fall, also mach es einfach nur so ;)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Kaliber


    Also ich kenne das Problem mit dem sscanf Plugin nicht ^^, deshalb bin ich davon ziemlich überrascht.
    Das überschreiben wäre nicht wirklich denkbar und zwar wird der Speixher dynamisch bei localen variablen frei gegeben jedoch nur die große , welche auch beansprucht wird, jedoch würde es mich interessieren wie ws mit globalen variablen aussieht da diese vom Speicher ganz anders gehandhabt werden.

  • Kaliber


    Also ich kenne das Problem mit dem sscanf Plugin nicht ^^, deshalb bin ich davon ziemlich überrascht.


    Ich auch nicht...aber in solchen Fällen verwende ich es auch nie :D


    Deshalb...war das nur vermutet...was da passieren kann ^^


    Das überschreiben wäre nicht wirklich denkbar und zwar wird der Speixher dynamisch bei localen variablen frei gegeben jedoch nur die große , welche auch beansprucht wird,


    Beim Stack (Lokalen Variablen) kann man das NULL Byte überschreiben...es folgt zwar ein Runtime Error, dennoch geht es:


    #include <a_samp>


    main() {
    new test[2];
    func(test);
    print(test); //->Gibt Hallo aus
    }


    func(...) {
    setarg(0,0,'H');
    setarg(0,1,'a');
    setarg(0,2,'l');
    setarg(0,3,'l');
    setarg(0,4,'o');
    }


    Bei globalen Variablen wird es begrenzt, sprich da kommt nur Ha raus...ohne Error :)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S