Bonjour,
je viens vous présenter la fonction que j'ai développée hier soir, une nouvelle implentation de strtok qui devrais, être plus rapide et sécuritaire, voici le monstre :
strtok(const source[], &index, dest[], separator = ' ')
strtok(const source[], &index, dest[], separator = ' ')
{
new i = 0;
while(source[index])//tant qu'on est pas à la fin du texte
{
if(source[index] != separator)//si l'on est pas encore rendu au séparateur
{
if((dest[i] = source[index]))//on copie l'information directement dans la destination
{
index++;//on augmente les deux
i++;
}
else
{
return 0;
}
}
else//on est rendu au séparateur
{
index++;//on saute le séparateur
break;
}
}
dest[i] = EOS;
return 1;
}
pour le test de rapidité, vous pouvez trouver le code source dans le pastebin sous le nom de strtok par Sim (il comporte malencontreusement une erreur (while(idx < 25) au lieu de while(idx < et ne contient pas de test sur la copie des données dans le string de destination...)
Usage
Son utilisation diffère légèrement de l'implantation habituelle, au lieu de retourner le string, elle le sauvegarde dans la chaine passer en paramètre. Voici un exemple basé sur une commande usuelle, prise dans mon script d'admin en développement:
Quelques définitions utilisées ici....
#define SendTypoMessage(%0,%1) SendClientMessage(%0, 0xffffffff, "FORMULATION: "%1)
#define SendLevelErrorMessage(%0) SendClientMessage(%0, 0xFF0000FF, "Tu n'as pas le niveau requis pour effectuer cette action!")
Maintenant la commande:
// COMMANDE POUR KICKER LES JOUEURS //
if(!strcmp(cmdtext, "/kick ", true, 6))
{
if(IsPlayerAdmin(playerid))
{
if(!cmdtext[6])
{
SendTypoMessage(playerid, "/kick [joueur] [raison (optionnel)]");
return 1;
}
new cmd[128], idx = 6, pid;
strtok(cmdtext, idx, cmd);//remarquez ici l'utilisation du strtok, au lieu de cmd = strtok(cmdtext, idx);
if(IsNumeric(cmd))
{
pid = strval(cmd);
}
else
{
pid = ReturnPlayerID(cmd);
}
if(!IsPlayerConnected(pid))
{
SendErrorMessage(playerid, "Ce joueur n'est pas connecté!");
return 1;
}
new AName[MAX_PLAYER_NAME], PName[MAX_PLAYER_NAME];
GetPlayerName(playerid, AName, MAX_PLAYER_NAME);
GetPlayerName(pid, PName, MAX_PLAYER_NAME);
if(cmdtext[idx])
{
format(cmd, sizeof(cmd), "Admin %s a kické %s car %s", AName, PName, cmdtext[idx]);
}
else
{
format(cmd, sizeof(cmd), "Admin %s a kické %s", AName, PName);
}
SendClientMessageToAll(COLOR_KICK, cmd);
Kick(pid);
}
else
{
SendLevelErrorMessage(playerid);
}
return 1;
}
EDIT: merci à Syg pour ses commentaires :P
++Sim++