GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Romeo_Urbano le 13 Mai 2014, 20:12:56
-
Bonjour tous le monde, je postes un nouveau message car je trouves pas la solution d'un truc même après avoir tester pleins de truc.
mon idée est facile:
Par exemple j'ai le message suivant "Salut je m'appel Romeo, j'ai changé mon prénom Romeo car j'aimais pas Romeo"
dans le code c'est écrit comme ça:
format(string, sizeof(string), "Salut je m'appel Romeo, j'ai changé mon prénom Romeo car j'aimais pas Romeo");
et se que je veux c'est que le script prend le message et change tout les "Romeo qui sont dans le texte et les changent par Walter.
en PHP c'est comme ça $string = str_replace("Romeo","Walter",$string);
Mais en pawno, je sais pas comment faire, j'ai testé le
string[strfind(string,"Romeo")] = 'Walter ';
mais ça marche pas, et j'ignore pourquoi :/
j'espère que j'étais clair et merci d'avance pour votre aide! à la prochaine
-
Alors voilà mon analyse
La fonction strfind ne renvoie pas toutes les cases de la chaine où elle a trouvé le string recherché, mais le nombre de cases avant.
Donc je te conseillerais une petite boucle "do while" dans ce genre : (J'ai fait ça en 5 minutes je sais pas si ça va fonctionner hein :D
strrep(string[], arep[], rep[])
{
new len = strlen(arep);
if(!len) return 0;
new pos;
if(strfind(string, arep) == -1) return 0;
do
{
pos = strfind(string, arep);
strdel(string, pos, pos+len);
strins(string, rep, pos, len);
}
while(strfind(string, arep) != -1);
return 1;
}
Je me permets de te donner le code déjà fait vu que t'as l'air déjà assez expérimenté pour le comprendre sans bêtement le copier-coller ^^
-
Salut, il y a quelques soucis dans ton code, l'utilisateur peut déclencher une boucle infini s'il fait un :
strrep(string, "chaine", "chaine");
Je te propose donc d'utiliser l'argument 'pos' dans la fonction 'strpos'.
Ta fonction est pas très bien optimisé, elle utilise plusieurs fois la fonction strfind, alors qu'elle peut le faire une fois par itération de boucle.
Sinon, voici comment je verrai ta fonction :
strrep(string[], arep[], rep[])
{
new len;
new pos;
len = strlen(arep);
pos = -1;
if(len)
{
while((pos = strfind(string, arep, pos + 1)) != -1)
{
strdel(string, pos, pos + len);
strins(string, rep, pos);
}
}
}
-
Vui enfin comme j'ai dit ça a été fait en 5 minutes sans vraiment réfléchir !
Mais bon, c'est à ça qu'internet sert, à partager les connaissances :D
Et d'ailleurs, merci de m'avoir montré qu'on puisse attribuer des valeurs aux variables lors d'une condition ! :kiss:
-
Bonjour tout le monde,
Vraiment je suis content et je vous remercie infiniment pour votre aide! j'avais penser à la même chose, mais vu que je maîtrises pas trop les string, je savais pas comment le faire, mais après votre réponse j'ai tout d'abord compris le code, et j'ai maintenant acquis de nouvelles connaissances sur les str qui vont trop m'aider prochainement, et finalement j'ai testé le code il marche sans 0 bug donc je vous remercie une autre fois.
par contre ton code avait deux warning une fois on utilise le code, mais j'ai réparé, le code qui marche et sans aucun warning est le suivant:
strrep(string[], arep[], rep[])
{
new len;
new pos;
len = strlen(arep);
pos = -1;
if(len)
{
while((pos = strfind(string, arep, true)) != -1)
{
strdel(string, pos, pos + len);
strins(string, rep, pos,strlen(string));
}
}
}
Sujet Close.
Cordialement Marouane