Petite explication d'un code

Petite explication d'un code - C - Programmation

Marsh Posté le 09-10-2007 à 00:25:23    

Bonjour, je suis en train d'étudier une fonction qui  copie une chaine dans une autre en connaissant l'espace mémoire aloué, mais je ne comprend pas tout.  
Je n'ai pas compris ce qui est en gras, si qq pouvait me l'expliquer.
 
Merci beaucoup d'avance.
 
char      *my_strncpy(char *dest, char *src, unsigned int size)
{
  char   *ret;
   
  ret = dest;
  while (size--)
    {
     if (*src)
 *(dest++) = *(src++);
      else
 *(dest++) = 0;

    }
  return (ret);
}

Reply

Marsh Posté le 09-10-2007 à 00:25:23   

Reply

Marsh Posté le 09-10-2007 à 00:27:29    

- Sais-tu ce que veut dire dest++ ?
- Sais-tu ce que veut dire (*src) ?

Reply

Marsh Posté le 09-10-2007 à 00:29:32    

-Dest++ :  on incrémente de 1
- *src : c'est un pointeur sur src

Reply

Marsh Posté le 09-10-2007 à 08:45:11    

he ho :
 
*src = déréférencement de pointeur, on accede au CONTENU de l'espace mémoire dont l'adresse est dans src.  
 
if(*src) /* on teste si le contenu de l'espace mémoire pointé par src est non nul, ici cela corespondrait à la fin de la chaine de caractéres */
 
*(dest++) : on incrémente dest et on renvoit ca vieille valeur. Comem c'ets un pointeur, on déréférence pour récupérer l'espace mémoire pointée.
 
-----
 
Aprés, quelques remarques :
-return est mot-clé pas une fonction, donc pas besoin de ces parenthèses moches.
- rassure moi que tu es en 1e année en école d'info ou à la fac et que cela fait partie du chapitre 0 du cours de C et que tu n'es pas en train de recoder strncpy pour un vrai projet.
 

Reply

Marsh Posté le 09-10-2007 à 15:54:43    

Oui c'est dans le chapitre 0 du C.
 
Mais je ne comprend pas par exemple quand j'ai ça:
 
while (*str++)
 
Par quoi on peut remplacer srt++ ? Je ne vois pas ce qe cela représente avec des connecteurs logiques ?

Reply

Marsh Posté le 09-10-2007 à 16:16:45    

while (*str++)  
{  
  /* trucs*/  
}
 
est équivalent à :
 
while (*str)  
{  
  str++;
  /* trucs*/  
 
}

Reply

Marsh Posté le 09-10-2007 à 17:21:39    

Pour être complet, on pourrait rapeler que str++ est éqivalent à str = str + 1, et rappeler que while (*str++) est équivalent à while ((*str++) != 0) et if (*src) est équivalent à if ((*src) != 0) car la condition est fausse si l'évaluation de l'expression donne zéro.
 
while (size--) signifie, tant que la variable "size" (pas terrible comme nom de variable, car "size" ressemble à un mot réservé) contient une valeur non nulle, puis décrémentation après le test de la condition.
 

Reply

Marsh Posté le 09-10-2007 à 17:32:38    

Joel F :
 
while (*str)  <-- Est-ce la même chose que (*str < 0) ?
{  
  str++;
  /* trucs*/  
 
}
 
-----------------------
 
while(Size --)
 
 est égal à =
 
while(Size > 0)
{
   /*truc;*/
   Size--;
 
Correct ?

Reply

Marsh Posté le 09-10-2007 à 18:07:26    

Almazard a écrit :

Joel F :

Code :
  1. while (*str)  <-- Est-ce la même chose que (*str < 0) ?
  2.   str++;
  3.   /* trucs*/ 
  4. }



Non. C'est la même chose que (*str != 0)

 

(Rappel : 0 est le caractère de fin de chaine).

Citation :


while(Size --)
 
 est égal à =

 

while(Size > 0)
{
   /*truc;*/
   Size--;

 

Correct ?


Oui, si Size est un entier ou un réel.


Message édité par Emmanuel Delahaye le 09-10-2007 à 18:39:15

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-10-2007 à 18:10:05    

Si on part du principe que Size à une valeur positive.
Sinon c'est pas vraiment équivalent à while(Size > 0) .
Non?


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 09-10-2007 à 18:10:05   

Reply

Marsh Posté le 09-10-2007 à 19:10:00    

Joel F a écrit :

while (*str++)  
{  
  /* trucs*/  
}
 
est équivalent à :
 
while (*str)  
{  
  str++;
  /* trucs*/  
 
}


 
Pas d'accord. En sortie de boucle, str pointe un cran plus loin dans la version du haut.

Reply

Marsh Posté le 09-10-2007 à 19:42:35    

certes j'était mal réveillé :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed