mehere sscanf mit mehreren parameter

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
  • Hey,
    hab ein Problem mit dem sscanf in der Zeile 12/13.
    geprintet wird bis 4, egal welchen versuch ich probiere.
    Ingame eingabe: /setstats 0 Respektpunkte 10

    ocmd:setstats(playerid,params[])
    {
    new str[144],pID,wert;
    print("1");
    if(sscanf(params,"us[144]",pID,str))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [name]"),SCM(playerid,-1,"[name]: Respektpunkte");
    print("2");
    if(!IsPlayerConnected(pID))return SCM(playerid,-1,"Der Spieler ist nicht online");
    print("3");
    if(!strcmp(str,"Respektpunkte",true))
    {
    print("4");
    if(sscanf(params,"d",wert))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");//versuch 1
    if(sscanf(params,"us[144]d",pID,str,wert))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");//versuch 2
    print("5");
    printf("%s || %d",str,wert);
    new old=SInfo[pID][pRespekt];SInfo[pID][pRespekt]=wert;
    new neu=SInfo[pID][pRespekt];
    print("6");
    SetPlayerProgressBarValue(playerid, ffffd, float(SInfo[playerid][pRespekt]));
    print("7");
    SCMEx(pID,-1,"Admin: %s hat deine Respektpunkte verändert. Vorher: %d Nacher: %d",SpielerName(playerid),old,neu);
    print("8");
    format(str,sizeof str,"SETSTATS: Admin %s hat die Respektpunkte von %s verändert. Vorher: %d Nacher: %d",SpielerName(playerid),SpielerName(pID),old,neu);
    printlog(str);
    print("9");
    }
    return 1;
    }

    Habs rumprobiert und ich finde den Fehler nicht. Findet ihn jemand?
    Danke

  • Mit strtok bist du besser dran.


    ocmd:setstats(playerid,params[])
    {
    new str[144],pID,wert, tmp[20], tmp2[20], tmp3[20], idx;
    tmp = strtok(params, idx);
    tmp2 = strtok(params, idx);
    if(!strlen(tmp2))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [name]"),SCM(playerid,-1,"[name]: Respektpunkte");
    if(IsNumeric(tmp)) pID = strval(tmp);
    else pID = ReturnPlayerID(tmp);
    if(!IsPlayerConnected(pID))return SCM(playerid,-1,"Der Spieler ist nicht online");
    if(!strcmp(tmp2,"Respektpunkte",true))
    {
    tmp3 = strtok(params, idx);
    if(!strlen(tmp3))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");
    new wert = strval(tmp3);
    new old=SInfo[pID][pRespekt];
    SInfo[pID][pRespekt]=wert;
    new neu=SInfo[pID][pRespekt];
    SetPlayerProgressBarValue(playerid, ffffd, float(SInfo[playerid][pRespekt]));
    SCMEx(pID,-1,"Admin: %s hat deine Respektpunkte verändert. Vorher: %d Nacher: %d",SpielerName(playerid),old,neu);
    format(str,sizeof str,"SETSTATS: Admin %s hat die Respektpunkte von %s verändert. Vorher: %d Nacher: %d",SpielerName(playerid),SpielerName(pID),old,neu);
    printlog(str);
    }
    return 1;
    }


    Funktionen die du definieren musst
    stock strtok(const string[], &index) //©Jeffry
    {
    new result[20], length = strlen(string), i = index;
    while ((i < length) && (string[i] == ' ')) i++;
    strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
    index++;
    return result;
    }

    Funktionen die du definieren musst
    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }

    Funktionen die du definieren musst
    stock IsNumeric(string[])
    {
    for (new i = 0, j = strlen(string); i < j; i++)
    {
    if ((string[i] > '9' || string[i] < '0')) return 0;
    }
    return 1;
    }

  • ocmd:setstats(playerid,params[])
    {
    /* -- */
    if(sscanf(params,"us[144]",pID,str))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [name]"),SCM(playerid,-1,"[name]: Respektpunkte");
    /* -- */
    if(!strcmp(str,"Respektpunkte",true))
    {
    /* -- */
    /* nachfolgende Zeile (versuch 1) kann nicht funktionieren. Du durchsuchst "params", was du ganz oben schon auf "us[144]" untersuchst hast.
    Das klappt nicht, den String auf "d" und auf "us[144]" gleichzeitig erfolgreich zu scannen.
    Eventuell erklärst du mal, was du damit vor hattest (oder du bleibst bei strtok, würde ich aber nicht machen).
    Ohne jetzt aber den Sinn hinter "versuch 1" zu kennen, würde ich die Zeile entfernen.*/
    if(sscanf(params,"d",wert))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");//versuch 1 -> Funktion wird hier durch beendet
    if(sscanf(params,"us[144]d",pID,str,wert))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");//versuch 2
    /* -- */
    }
    return 1;
    }