Hallo!
Kann mir jemand erklären wie man mit strtok umgeht ?
Ich möchte das auch mal lernen.
Beispiel: /kick [Name/PlayerID] [Grund] ||/timeban [Name/PlayerID] [Zeit] [Grund]
mfg
Hallo!
Kann mir jemand erklären wie man mit strtok umgeht ?
Ich möchte das auch mal lernen.
Beispiel: /kick [Name/PlayerID] [Grund] ||/timeban [Name/PlayerID] [Zeit] [Grund]
mfg
Wie genau muss die Erklärung sein?
Reicht dir das hier erst mal?
Tutorial: http://forum.sa-mp.com/showthread.php?t=188617
Funktionen die du benötigst, für den guten Umgang mit strtok:
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;
}
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;
}
stock IsNumeric(string[])
{
for (new i = 0, j = strlen(string); i < j; i++)
{
if ((string[i] > '9' || string[i] < '0')) return 0;
}
return 1;
}
Beispielbefehl:
dcmd_befehl(playerid,params[])
{
new pID, tmp[20], idx;
tmp = strtok(params, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000FF,"Fehler: /befehl [playerid/SpielerName]");
if(IsNumeric(tmp)) pID = strval(tmp);
else pID = ReturnPlayerID(tmp);
if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0xFF0000FF,"Der Spieler ist nicht online");
//Code hier.
return 1;
}
Ich möchte die Befehle in dem ganz normalen Callback OnPlayerCommandText schreiben.
Ich probiere gerade mal rum, deine Funktionen scheinen mir schon mal ganz nützlich.
mfg
Funktioniert genau gleich, nur dass dann eben der erste strtok-Wert den eingegebenen Befehl darstellt.
Falls Fragen sind, einfach nachfragen.
strtok FTW
Ok, anscheinend hat mein Versuch Funktioniert.
Aber ich finde der Befehl sieht etwas hässlig so aus, kann man den nicht schöner gestalten ?
if(!strcmp(cmd, "/veh", true)){
new vehicleid[20],color1[20],color2[20];
vehicleid=strtok(cmdtext,idx);
if(!strlen(vehicleid))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
if(!IsNumeric(vehicleid))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
color1=strtok(cmdtext,idx);
if(!strlen(color1))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
if(!IsNumeric(color1))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
color2=strtok(cmdtext,idx);
if(!strlen(color2))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
if(!IsNumeric(color2))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
new string[60];
format(string,sizeof string,"Du hast dir ein Fahrzeug erstellt. (%i|%i,%i)",strval(vehicleid),strval(color1),strval(color2)),
SendClientMessage(playerid,-1,string);
new Float:mp[4];
GetPlayerPos(playerid,mp[0],mp[1],mp[2]),GetPlayerFacingAngle(playerid,mp[3]),
CreateVehicle(strval(vehicleid),mp[0],mp[1],mp[2],mp[3],strval(color1),strval(color2),-1);
return 1;
}
mfg
Klar, oft schreibt man die strtok's auch einfach hintereinander, je nach dem wie einem das gefällt. Ändern tut es nichts.
if(!strcmp(cmd, "/veh", true))
{
new vehicleid[20],color1[20],color2[20], string[60], Float:mp[4];
vehicleid=strtok(cmdtext,idx), color1=strtok(cmdtext,idx), color2=strtok(cmdtext,idx);
if(!strlen(color2) || !IsNumeric(vehicleid) || !IsNumeric(color1) || !IsNumeric(color2))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
format(string,sizeof string,"Du hast dir ein Fahrzeug erstellt. (%i|%i,%i)",strval(vehicleid),strval(color1),strval(color2)),
SendClientMessage(playerid,-1,string);
GetPlayerPos(playerid,mp[0],mp[1],mp[2]),GetPlayerFacingAngle(playerid,mp[3]),
CreateVehicle(strval(vehicleid),mp[0],mp[1],mp[2],mp[3],strval(color1),strval(color2),-1);
return 1;
}
Vielen Dank, mehr muss ich zum Thema strtok nicht wissen oder ?
mfg
Nicht direkt. Kommt auf dein Vorhaben an, aber wenn du nur solche Befehle erstellen willst, dann passt das so.
Da strtok nicht viel macht, muss man auch nicht viel dazu wissen. Es gibt einfach nur einen String zurück, den man dann entsprechend verarbeiten muss.
Okay cool, was mich nebenbei auch mal Interessieren würde.
Arbeitet strtok schneller oder langsamer als sscanf und merkt man im Spielgeschehen einen Unterschied ?
mfg
Es ist langsamer, allerdings merkst du im Spielgeschehen keinen Unterschied, da dies weniger als Millisekunden ausmacht.
Daher ist es für mich erste Wahl, da ich nicht von einem Plugin abhängig bin, das von Version zu Version aktualisiert werden muss.
Okay, das klingt sehr gut.
Aber was in denn jetzt mit strtok alles möglich ?
ZitatNicht direkt. Kommt auf dein Vorhaben an, aber wenn du nur solche Befehle erstellen willst, dann passt das so.
mfg
Mit strtok kannst du strings nach Leerzeichen splitten. Mehr nicht.
Der Rest wird ja durch andere Funktionen (z.B. strval) gemacht. Je nach dem was du auslesen willst, musst du die entsprechenden Funktionen kennen (floatstr, IsNumeric, ...).
Okay, vielen Dank für die schnelle Erklärung!
Absofort werde ich mit strtok arbeiten.
mfg