• 11 Juillet 2025, 11:53:43


Auteur Sujet: Strtok  (Lu 751 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Nesik

  • *
  • Grand Banditisme
  • Messages: 674
    • Voir le profil
    • Uknow
Strtok
« le: 16 Août 2010, 17:08:19 »
Bonjour à tous,

Je ne comprend pas du tous le strtok,même sur le wiki,jai beau essayé de comprendre,ba je pige pas....

Si quelqu'un de (très) généreux pourait faire un tuto bien expliqué ça m'aidrais beaucoup


Hors ligne Nesik

  • *
  • Grand Banditisme
  • Messages: 674
    • Voir le profil
    • Uknow
Re : Strtok
« Réponse #1 le: 16 Août 2010, 18:14:31 »
Ca je savais mais c'est pour l'utilisation plus

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Strtok
« Réponse #2 le: 17 Août 2010, 04:56:56 »
Salut,

tiens je vais essayer, en utilisant MA version de strtok:

strtok (const source[], &index, dest[], separator = ' ')
{
new i = 0;
while ((dest[i] = source[index]))//tant qu'on est pas à la fin du texte et que la destination est suffisamment longue, bref qu'on arrive à copier les informations de la source à la destination....
{
if (source[index] != separator)//si l'on est pas encore rendu au séparateur
{
index++;//on augmente les deux
i++;
}
else//on est rendu au séparateur
{
do
{
index++;//on saute le séparateur
}
while(source[index] == separator);
break;
}
}
}

pourquoi?
Cette fonction est plus rapide que le strtok traditionnel même si elle ne répond pas exactement à la même syntaxe, il faudrait la renommer en un truc du genre: GetBySeparatorFromIndex mais c'est un peu long...

Donc, premièrement, que fais la fonction?

Cette fonction permet de séparer un texte long en parties plus courtes sans altérer la chaine originale en choisissant un caractère comme délimiteur. En gros, quand la fonction rencontre ce caractère dans la chaine, elle coupe.

Par exemple, si l'on séparer la phrase suivante depuis le début (index = 0):

Émilie a un jolie chien blond.

En utilisant comme délimiteur le caractère ' ' (espace), on obtient ceci (en utilisant la fonction une multitude de fois):

Émilie
a
un
jolie
chien
blond.

En utilisation comme délimiteur le caractère 'i', on obtient:

Em
l
e a un jol
e ch
en blond.

(pas très beau ni utile...)

Enfin, l'essentiel c'est de comprendre le principe, j'espère que l'exemple est assez clair. à noter qu'il est toujours possible de reculer ou d'avancer dans la phrase en variant la valeur du paramètre index.

Maintenant, en ce qui concerne l'utilisation:

Prenons un cas de commande assez classique:

public OnPlayerCommandText(playerid, cmdtext[])
{
new index = 1;//1 car on peut sauter le / qui est inutile à tester....
new string[128];//longueur 128 = max I/O du client, donc on ne risque pas de manquer d'espace pour y stocker la chaine
strtok(cmdtext, index, string);//on ne met pas le délimiteur car on utilise celui par défaut (espace)
//NB1. index n'a plus la même valeur, il est désormais placé soit après le dernier caractère copier (dans le cas de cette commande, le dernier k), soit après l'espace ayant servi de délimiteur

if(strcmp(string, "kick", true) == 0)//le joueur a entré /kick
{
//grâce au point NB1, on peut tester sans employer la fonction à nouveau si le joueur a entré une information à la suite du /kick
if(cmdtext[index] == 0)//si l'index pointe le caractère de fin du texte (valeur 0), c'est qu'il n'y a rien après le /kick
{
SendClientmessage(playerid, COLOR_RED, "Formulation: /kick [id du joueur]");
}
else
{
new pid = strval(cmdtext[index]);//on récupère l'ID entré, on pourrait aussi vérifier s'il s'agit d'un nombre avec un IsNumeric
if(pid != playerid && IsPlayerConnected(pid))
{
GetPlayerName(pid, string, MAX_PLAYER_NAME);//on récupère le nom du joueur en question et le stock dans la variable string désormais inutile...
format(string, sizeof(string), "Le Joueur %s a été kické du serveur!", string);//on format le message
SendClientMessageToAll(COLOR_GREEN, string);//on envoie le message
Kick(pid);//finalement on éjecte le joueur
}
}
return 1;
}
return 0;
}

voilà, j'espère que les commentaires t'ont aidés.

Comme mentionné plus haut, tu peut utiliser plusieurs fois de suite la fonction, mais attention, à chaque fois la fonction se déplace dans la chaine.

si tu veut plus de détails sur certains points tu peut demander plus d'informations

PS. Dizzy-Beno, dans ton exemple strtok renverrait dans cet ordre: Bonjour, John puis Cena.

++Sim++