begin process at 2012 02 12 17:40:15
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > REPROGRAMMER STRLEN ET STRCPY

REPROGRAMMER STRLEN ET STRCPY


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Niveau :Débutant Date de création :21/01/2003 Date de mise à jour :21/01/2003 19:21:01 Vu :6 868

Auteur : glipper

Ecrire un message privé
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


 Sources du même auteur

Source avec Zip LIBRAIRIE POUR ÉVITER LES FUITES MEMOIRES
Source avec Zip Source avec une capture SCANDISC SIMPLE POUR LISTER LE CONTENU D'UN REPERTOIRE (+ DE...
Source avec Zip Source avec une capture GETOPENFILENAME AVEC UNE TREEVIEW + CLIQUE DROIT
Source avec Zip COURS POINTEURS
FONCTIONS À TAILLE VARIABLE D'ARGUMENTS

 Sources de la même categorie

Source avec Zip SCHEDULER RR FIFO par yvesB87
Source avec Zip ALGORITHMES RÉCURSIFS VS ALGORITHMES ITÉRATIFS par yvesB87
Source avec Zip Source avec une capture C++ FORMAT D'IMAGE AVEC QT par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip Source avec une capture [C++] CLASS REGISTER par Miwik

Commentaires et avis

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.

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 ?

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)

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

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

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.

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++);
}

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

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

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,387 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales