samedi 28 février 2009

Petit module en C : GeoStr (original, comme nom, pas vrai ?!)

Bien le bonjour/bonsoir.

Je suis encore en vie. J'ai pas encore été empalé par un sabre ou été renversé par un camion de livraison. Je suis là, devant mon PC, et je vais vous parler d'un truc avec un niveau peu élevé (je m'adresse, bien évidemment, aux mofos genre Unknown*Dragoon, shp, et toutes les tapz qui vont rire).

J'ai fait un module pour manipuler des chaînes en C. C'est pas complet, mais ça me sert. A la base, c'était pour un usage perso - flemme de diffuser si c'est pour se recevoir des "mouais, tu réinventes la roue et tu sers à rien" ; c'est pour le plaisir de l'algorithme ! :}

Quatre fonctions :

- int GeoStr_Count(char *chaine, char motif);
Retourne le nombre de motif présent dans chaine.

Exemple : GeoStr_Count("Salutations",'a'); renverra 2.


- int GeoStr_GetIndiceFromMotif(char *chaine, char motif, int pos);
Retourne l'index du posième motif dans chaine

Exemple : GeoStr_GetIndiceFromMotif('Salutations','a',1); renverra l'index du premier 'a', soit 1 ;
GeoStr_GetIndiceFromMotif('Salutations','a',2); renverra l'index du second 'a', soit 5 !

- char *GeoStr_substring(char *chaine, int debut, int combien);
Qui ne connait pas lafonction substring ? Elle renvoit combien octets en partant de l'index debut, dans chaine

Exemple :
*GeoStr_substring('Salutations',3,8); renverra 'lutations'.


- char **GeoStr_explode(char *chaine, char motif);
Le clou du pestacle ! La fonction explode renvoit un tableau de chaines issues de chaine, séparées par motif. Le second argument n'est, malheureusement, pas une chaine de caractère. J'avais pas le courage de faire ça, étant donné que j'ai pondu cette fonction à 2h du matin.

Exemple : GeoStr_explode("02/10/1989",'/') renverra un tableau de chaines :
[0] = "02";
[1] = "10";
[2] = "1989";




Les fichiers constituant le module se trouvent ici : http://venom630.free.fr/geo/?path=tools/GeoStr

Si jamais (et je dis bien, si jamais) vous avez du temps (à perdre ?) pour faire évoluer la bête, n'hésitez pas à me le signaler par mail ou par commentaire. Ca m'intéresserait d'avoir des fonctions que j'ai comprises et dont je peux me servir pour plusieurs trucs, notamment niveau études.

Conclusion


Je suis pas mort, et je code encore. Voilà.

Geo

PS : Je salue NiklosKoda, pour le fun. Et je le soutien pour la parution de son article complet (comme le pain de mie) sur les injections SQL. Je dédierai un article à ce sujet, car ça vaut vraiment le coup pour les débutants.

2 commentaires:

  1. Genre comment tu me surestimes \o/.

    J'ai parcouru le code en diagonale.

    L'avantage de coder ce genre de trucs c'est que ça fait pas mal taffer le C. J'ai regardé brièvement la source, et selon moi y'a énormément d'allocation pour pas grand chose. Si tu alloues dynamiquement des trucs dans tes fonctions, ces trucs perdureront jusqu'à ce que tu les free, ou jusqu'à la fin du programme, pas sûr que ce soit un bon parti à prendre (ça dépend de l'utilisation future de ton module en fait).

    Le souci c'est qu'en C89 on a pas trop le choix à ce niveau là (et le C99 c'est mal !). Puis retourner un pointeur sur une variable locale, pas tip top (même plantage assuré ^^).

    Donc solution : changer le proto' de ta fonction et lui passer un pointeur vers le buffer de sortie que tu auras alloué comme tu veux dans ton main. Ouais c'est pas joli, mais c'est statique.

    Bon entre nous soit dit, j'ai pondu ce truc pour faire genre "ton code est critiquable" hein. Mais j'pense que t'as bien fait de partir dans du malloc =). J'aurais fait pareil en tout cas xD.

    RépondreSupprimer
  2. salut mon géo
    sympa sympa ton code, mais bon faut pas que le gars oublie de free tes malloc.
    après pas obligé de reinventer la roue comme tu l'as dis, surtout qu'avec le c++ ton code il vaut plus rien, met toi au c++ et va mater la classe string cay la vie
    en tout cas plaisir que tu sois pas mort, jferais comment moi sans bergère ?
    allez +++ et continue à passer sur mon site et à apprendre mes articles par coeur :)

    RépondreSupprimer