Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

REPROGRAMMER STRLEN ET STRCPY


Information sur la source

Catégorie :Astuces Niveau : Débutant Date de création : 21/01/2003 Date de mise à jour : 21/01/2003 19:21:01 Vu : 4 543

Note :
9,67 / 10 - par 3 personnes
9,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

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

  • #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;
  • }
#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
- ...

   =&gt; Enfin tout ce que vous avez a dire sur ce programme

 

Commentaires et avis

signaler à un administrateur
Commentaire de FloZix le 22/01/2003 10:09:13

utiliser un break dans le if c'est bofff... c'était plus simple de mettre la condition dans le while et du coup eviter le break. Enfin il me semble.

signaler à un administrateur
Commentaire de Kikyo le 22/01/2003 14:27:28

FloZix le "break" est dans le if(...) mais agit sur la boucle "do...while"... enfin je sais pas si c grave mais moi je vois pas où c méchant ^^

Sinon pour le myStrlen(...) ce cerait pas mieux de copier l'adresse du pointeur *p dans un autre pointeur *p2 au début de la fonction ainsi pour retourner le nombre de charatères il sefit de retourner (p - p2) ainsi celà évite d'incrémenter count... celà me parait plus optimiser non ?

signaler à un administrateur
Commentaire de davwart le 22/01/2003 16:09:10

Moi je suis largement de l"avis de FloZix, c'est à dire faire un
while(*pScr!='')
{
--
}

plutot qu'un do---if break--- while(1)

signaler à un administrateur
Commentaire de FloZix le 22/01/2003 22:41:38

c'est pas vraiment mechant de mettre un break mais c'est une maniere un peu violente de sortir de la boucle... quand on peu eviter c'est mieux. le break c'est surtout utilie dans un switch sinon ya souvent moyen d'eviter...

signaler à un administrateur
Commentaire de glipper le 23/01/2003 12:30:03

Je suis d'accord avec vous pour la fonction &lt;myStrlen&gt;,
mais pas pour la fonction &lt;myStrcpy&gt; car il faut copier le '' a
chaque fois.(j'aurais pu le faire en dehors de la boucle ...)
Et pour information je ne pense pas que un &lt;break&gt; dans un &lt;if&gt;
soit tres mechant car parfois cela est tres utile ...

signaler à un administrateur
Commentaire de glipper le 23/01/2003 12:31:35

juste pour dire que le " est le caractère d'arret (\0)
Mais il est pas passé quand je l'ai ecrit.

signaler à un administrateur
Commentaire de Azar le 23/01/2003 20:43:34

pour strcpy tu pourrais aussi faire :
void myStrcpy(char* str1, char* str2){
  while(*str1++=*str2++);
}

signaler à un administrateur
Commentaire de glipper le 24/01/2003 11:26:49

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...

signaler à un administrateur
Commentaire de BruNews le 24/01/2003 14:35:50 administrateur CS

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...

signaler à un administrateur
Commentaire de KissyFroth le 08/12/2005 23:57:47

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.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,577 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.