Reprogrammer strlen et strcpy

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 835 fois - Téléchargée 34 fois

Contenu du snippet

Voici comment reprogrammer certaines fonctions
qui gerent les chaines de caracteres.
Elles sont toutes deja faites dans <string.h>
Ici on reprogrammera les fonctions :
- strlen
- strcpy

Tout d'abord quelques petits rappels betes et mechants:

Soit <p> une chaine de caractere qui est "abc xyz"
p est un pointeur sur le premier caractere i.e. 'a'
p est egal a "abc xyz"
  • p est egal a sur quoi pointe p i.e. 'a'
  • (p+1) est egal a sur le caractere suivant i.e. 'b'
  • (p+3) est egal a ' '
  • (p+6) est egal a 'z'
  • (p+6) est egal a 'z' --- caractere d'arret ---
  • (p+8) est indetermine : *(p+8) = ???


Maintenant on execute l'instruction suivante :
p ++;
On a donc :
p est egal a "bc xyz"
  • p est egal a sur quoi pointe p i.e. 'b'
  • (p+1) est egal a sur le caractere suivant i.e. 'c'
  • (p+2) est egal a ' '
  • (p+5) est egal a 'z'
  • (p+6) est egal a '\0' --- caractere d'arret ---
  • (p+7) est indetermine : *(p+7) = ???


Maintenant on execute l'instruction suivante :
p += 6;
On a donc :
p est egal a "" --- chaine nulle ---
  • p est egal a sur quoi pointe p i.e. '\0'
  • (p+1) est indetermine : *(p+6) = ???


c'en est fini pour les petits rappels

Source / Exemple :


#include <stdio.h>

int myStrlen(const char *p)  // Elle retourne la longueur de la chaine <p>
{
int count;

count = 0;

do
  {
  if(*p == '\0')
	 {
	 break;
	 }
  else
	 {
	 p     ++;
	 count ++;
	 }
  }while(1);

return count;
}

//
//  Fonction  : <myStrcpy>
//
//  Retourne  : le nombre de caractere copie y compris le '\0'

//  <pDest> : Destination
//  <pScr>  : Source
int myStrcpy(char *pDest,const char *pScr)
{
int count;

count = 0;

do
  {

  • pDest = *pScr;
count ++; if(*pScr == '\0') { break; } pDest ++; pScr ++; }while(1); return count; } // ------------------------------------------------------ // int main(int argc,char **argv) { char text[256] = "Coucou"; char buf[256]; int countBuf; // pour n'avoir aucun Warning ... (void) argc; (void) argv; printf("Taille de '%s' = %d\n",text,myStrlen(text)); countBuf = myStrcpy(buf,text); // c'est complique : \'\\0\' // tout ca pour ecrire : '\0' a l'ecran printf("Taille de '%s' = %d --- avec le \'\\0\' ---\n",buf,countBuf); // aucun erreur, on retourne 0 return 0; }

Conclusion :


Voila c'est fini ...
Reprogrammer des fonctions deja faites n'est pas bien utile
mais il est bien de savoir comment elles peuvent etre programmees

je dis bien "elles peuvent" car elle ne sont pas programmer exactement
comme ci-dessus

- Tout bug est le bienvenu
- Les remarques aussi
- Les commentaires aussi
- Les critiques aussi
- ...

=> Enfin tout ce que vous avez a dire sur ce programme

A voir également

Ajouter un commentaire

Commentaires

KissyFroth
Messages postés
38
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
7 avril 2007
-
Un tres grand merci à cette source : il y a parfois des petits détails sur lesquels on bute et qui vous empechent d'avancer : perso ca fai 1 heure que je cherche le caractere d'arret qui est donc '\0'. Maintenant je le saurais. Merci encore.
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
Salut,
pour myStrlen() le count ne sert à rien.
int myStrlen(const char *p)
{
char *c = p;
while(*c) c++;
return (c - p);
}
pour myStrcpy() tu peux faire idem.
Il faut toujours regarder la sortie ASM produite par le compilateur.
ciao...
glipper
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
1 -
Reponse a Kikyo:
Ta methode marche... mais elle est + lentec (d'apres mes testes),
car faire une difference d'adresse (= de pointeur) prend enormement
de temps ... il faut diviser par le taille du type i.e. sizeof(char).
Peut-etre que ta methode est la meilleur pour un texte tres long...
cs_Azar
Messages postés
9
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
27 septembre 2003
-
pour strcpy tu pourrais aussi faire :
void myStrcpy(char* str1, char* str2){
while(*str1++=*str2++);
}
glipper
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
1 -
juste pour dire que le " est le caractère d'arret (\0)
Mais il est pas passé quand je l'ai ecrit.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.