Créer une fonction de remplacement pour les chaînes dans Delphi
Note de l'éditeur : En fait, la fonction StringReplace de Delphi est spécifiquement conçue pour répondre à ce besoin. Mais nous publions également cet article – au moins l’auteur propose une alternative, et l’esprit d’exploration doit être encouragé ! Ceci est mon premier article ici, et comme mon niveau n'est pas très élevé, je vais aborder une question basique mais très pratique, j'espère que cela pourra vous aider. Les amis qui ont utilisé VB ou ASP savent qu'il existe une fonction de remplacement très pratique dans VB. Sa fonction est de remplacer la chaîne qui correspond à la sous-chaîne (également appelée chaîne de modèle) dans une chaîne par la chaîne spécifiée. Par exemple, il existe une telle chaîne : s:='apple is apple!'. Après avoir utilisé la fonction de remplacement pour remplacer (s,'apple','box'), s devient 'box is box!'. La longueur de la chaîne change également en conséquence. Il s'agit d'une fonction très utile. Tout le monde sait que les instructions de requête structurées SQL sont souvent utilisées lors du développement de systèmes de bases de données, et cette instruction est sensible à certains caractères, tels que les guillemets simples, si un guillemet simple apparaît dans l'instruction SQL (à cause des guillemets simples). sont utilisés en m² l) le programme provoquera des erreurs inattendues, et pourra même être utilisé par d'autres pour provoquer de graves failles de sécurité dans le système (c'est la fameuse attaque par injection SQL, je crois que tout le monde se souvient encore de ce qui a été découvert par le forum CSDN auparavant) C'est une faille ). À ce stade, vous devez remplacer les guillemets simples par d'autres chaînes ou des chaînes vides lors des opérations de base de données, puis les remplacer lors de la lecture des données, afin que les guillemets simples puissent être enregistrés dans l'enregistrement de données sans erreur. Cependant, je n'ai pas trouvé de fonction similaire dans Delphi (peut-être que je ne l'ai pas trouvée ?), ce qui était vraiment gênant, alors j'en ai écrit une moi-même, ce qui sera beaucoup plus pratique dans le développement futur d'un système de base de données. Après avoir dit tant de bêtises, voici le code, il devrait être plus facile à comprendre avec des commentaires.
PRocedure replace(var s:string;const SourceChar:pchar;const RChar:pchar); // Le premier paramètre est la chaîne d'origine, le deuxième est la chaîne de modèle et le troisième est la chaîne de remplacement var ta,i,j : entier ; m,n,pn,sn :entier ; SLen,SCLen,RCLen:integer;//SLen représente la longueur de la chaîne d'origine, SCLen représente la longueur transmise par le mode, RCLen représente la longueur de la chaîne de remplacement IsSame:integer; enregistrer le tableau de caractères remplacé start SLen:=strlen(pchar(s));SCLen:=strlen(SourceChar);RCLen:=strlen(RChar); j:=pos(string(SourceChar),s); s:=s+chr(0);ta:=0;i:=j; while s[i]<>chr(0) do // Cette boucle utilise ta compte le nombre de fois où la chaîne de modèle apparaît dans la chaîne d'origine. start n:=0;IsSame:=1; for m:=i to i+SCLen-1 do start if m>SLen then start IsSame:=0;break ; fin; si s[m]<>sourceChar[n] then start IsSame:=0;break; end ; if IsSame=1 then start ta:=ta+1;i:=m; je:=i+1; fin; si j>0 alors commence pn:=0;sn:=1; setlength(newp,SLen-ta*SCLen+ta*RCLen+1);// Allouer la longueur de newp, +1 signifie qu'il y a un terminateur #0 derrière
tandis que s[sn]<>chr(0) do // Principalement une boucle, commencez à remplacer start n:=0;IsSame:=1; for m:=sn to sn+SCLen-1 do // Comparez si la sous-chaîne est la même que la chaîne de modèle start if m>SLen then start IsSame
: =0;break; if s[m]<>sourceChar[n] then start IsSame:=0;break end; if IsSame=1 then// Même début pour m:=0 à RCLen-1 do start newp [ pn]:=RChar[m];pn :=pn+
1 end ; // Différent newp[pn]:=s[sn]; pn:=pn+1;sn:=sn+ 1 ; end ; / resets , remplacement terminé ! fin; fin; En fait, il s'agit d'un problème fondamental de structure de données. Aujourd'hui, lorsque nous programmons souvent avec des contrôles glisser-déposer, nous devrions simplement pratiquer la structure des données. Bien sûr, cette fonction n'est pas écrite de manière optimale. J'ai testé le remplacement d'une chaîne de 10 000 mots et cela a pris une demi-seconde. La complexité temporelle est encore relativement élevée. Si vous avez une meilleure méthode, n'hésitez pas à en discuter !