De la même manière qu'au précédent chapitre (les tableaux), je poste mes fonctions de manipulation de chaîne que M@teo a demandé. Je ne les poste pas pour dire "Hey, je suis le plus fort, j'ai réussi" (même si c'est vrai ), mais pour entendre vos critiques quant à mon code.
Je n'ai pas encore eu le temps de réfléchir beaucoup à strstr();
Secret (cliquez pour afficher)
/*
* Fonctions C de manipulation de chaines
*
* par pepe
*/
int pstrlen(char chaine[]){/* strlen */ int i = 0; for(i=0; chaine[i] != '\0'; i++){} return i; }
void pstrcpy(char chaine[],char copie[]){/* strcpy */ int i = 0; for(i=0;chaine[i]!='\0';i++){
copie[i] = chaine[i]; } } void pstrcat(char* chaine,constchar* chaine2){/* strcat */ int i = pstrlen(chaine); int j = 0; for(j=0;chaine2[j]!='\0';j++,i++){
chaine[i]=chaine2[j]; } } int pstrcmp(char chaine[],char chaine2[]){/* strcmp */ int retour = 0; int i = 0; if(pstrlen(chaine) != pstrlen(chaine2)) return1; for(i = 0;chaine[i] != '\0'; i++){ if(chaine[i] != chaine2[i]) return1; } return0; } char* pstrchr(char chaine[],char find){/* strchr */ int i = 0; for(i = 0;chaine[i]!='\0';i++){ if(chaine[i] == find)return &chaine[i]; } return chaine; } char* pstrbrk(char chaine[],char list[]){/* strbrk */ int i = 0; int j = 0; for(i=0;chaine[i]!='\0';i++){ for(j = 0;list[j]!='\0';j++){ if(chaine[i] == list[j])return &chaine[i]; } } return chaine; }
PS : Je mets en secret pour ceux qui veulent les faire, mais qui ne les ont pas encore fait .
int pstrlen(char chaine[]){/* strlen */ int i = 0; for(i=0; chaine[i] != '\0'; i++){} return i; }
=>
int pstrlen(char chaine[]){/* strlen */ int i = 0; while(chaine[++i] != '\0') ; return i; }
Pour les autres j'ai trop sommeil pour regarder. Je vais dormir.
Pense à espacer les opérateurs :
for(j=0;chaine2[j]!='\0';j++,i++){
sans sur-espacer. Le manque d'espace nuit à la lisibilité, tout comme le sur-espacement :
for( j = 0 ; chaine2 [ j ] != '\0' ; j++ , i++ ) {
Bien :
for(j = 0; chaine2[j] != '\0'; j++, i++){
Et aussi, prends l'habitude de faire --i dans tes for, et pas i--. C'est infimement plus rapide. Mais imagine que tu gagnes un cent millième de seconde en faisant for(i;;++i) au lieu de for(i;;i++), et que for(i;;++i) soit deja dans une boucle for. Imagine encore que chacune de ces deux boucles fassent 10'000 itérations. 10'000 * 10'000 * 1/100'000 = 16 secondes
Et franchement, c'est deja bien
victor > ton code est faux ; si on passe "", ça va planter.
Sinon coller le mot-clé aux parenthèses et celles-ci à l'accolade est une mauvaise habitude, c'est très chiant à lire après...
Sur ++i et i++, c'est pas fondamentalement vrai ; en fait en C ça n'a aucune influence spécialce, le compilo sait mieux que toi ce qu'il fait, en C++ ça en a si on surcharge ++.
Remarque générale : Si tu peux, utilise des pointeurs ; yen a qui vont me faire chier comme quoi c'est moche, pas lisible et tout blahblah mais c'est comme ça que ça se fait en C... et c'est plus lisible selon moi.
Ouais enfin globalement c'est bien t'as compris
J'aurais renvoyé NULL si mes recherches n'ont rien donné en revanche, mais à part ça c'est tout ce que je vois.
J'ai tenu compte de vos remarques à propos de l'espacement, mais que fais-je de la remarque à propos de la post-incrémentation vs. pré-incrémentation ?
Voici en cadeau bonus (je sais que vous l'attendiez tous), ma fonction strstr() :
int pstrstr(char chaine[],char chaine2[]){/* strstr */ int i = 0; int j = 0; int k = 0; for(i = 0; chaine[i] != '\0'; i++){ if(chaine[i] == chaine2[j]){ for(j = 0; chaine2[j] != '\0'; i++, j++){ if(chaine[i] == chaine2[j]) k++; elsebreak; } } if(k == pstrlen(chaine2))break; } if(k == pstrlen(chaine2))return1; elsereturn0; }
Voilà, il y a sûrement moyen de l'optimiser .
[C] - Fonctions de Manipulation de chaîne
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
If you'd like to join us, read "How do we work at OpenClassrooms"! :)