|
|
|
|
Ya tu quelqu'un qui peut m'aider a mettre la ligne dans le while sur plusieurs ligne. J'ai essayé plusieurs chose mais a matin on dirait qui a rien qui marche. :P
voici le code : (pDst et pSrc sont des pointeurs de char)
bool bStop = false;
while(!bStop || *pSrc)
{
bStop = (*pDst++ = *pSrc++) == _T('\0');
}
*pDst++ = _T('\0');
Je me suis retrouvé ici par hasard :) Le sujet est passé depuis pas mal de temps mais je tenais à "hurler" face à la solution donnée.
|
En fait la question était mal posée je viens de capter que ce n'était pas le while qu'il voulait éclater mais ce qu'il y avait dans le bloc while (en tout c'est pour ça qu'à l'époque j'avais mis un break).
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void my_strcpy(char *dst,char *src){
while(*src != '\0'){
*dst = *src;
++src;
++dst;
}
}
int main(){
char *src = "tapir";
char *dst = (char *)calloc((strlen(src)+1),sizeof(char));
my_strcpy(dst,src);
printf("src = %s\n",src);
printf("dst = %s\n",dst);
free(dst);
return 0;
}
Ce qui donne bien : (mando@polgara) (~) $ gcc -W -Wall plop.c (mando@polgara) (~) $ ./a.out src = tapir dst = tapir La fonction my_strcpy peut aussi s'écrire ainsi void my_strcpy2(char *dst,char *src){
while(*src != '\0') *dst++ = *src++;
}
ou encore void my_strcpy3(char *dst,char *src){
for(;*src != '\0';++src,++dst) *dst = *src;
}
Pour revenir aux histoires de pré et post incrémentation, la différence est simple. Une post incrémentation est évaluée après exécution de l'instruction, un pré incrémentation avant. Quand tu incrémentes une variable tu peux écrire indifferemment l'une ou l'autre. for(i=0;i<10;++i) printf("%d\n",i);
for(i=0;i<10;i++) printf("%d\n",i);
Par contre l'exemple my_strcpy2 est un exemple clair ou il faut bien distinguer les deux : 1) on récupère la référence de *dst 2) on la passe à l'opérateur = 3) on récupère la référence de *src 4) on rentre dans le code de l'opérateur = : on affecte la valeur de *dst à *src 5) on post incrémente dst 6) on post incrémente src Typiquement si tu préincrémentes tu vas louper le premier caractère de src et de dst. void my_strcpy_bug(char *dst,char *src){
while(*src != '\0') *++dst = *++src;
}
Dans ce cas là tu vas avoir dst = "\0apir\0" ce qui à l'affichage donnera une chaîne vide. #include <stdlib.h>
#include <stdio.h>
#include <string.h>
void my_strcpy(char *dst,char *src){
while(*src != '\0') *++dst = *++src;
}
int main(){
unsigned int i;
char *src = "tapir";
char *dst = (char *)calloc((strlen(src)+1),sizeof(char));
my_strcpy(dst,src);
printf("src = %s\n",src);
printf("dst = %s\n",dst);
for(i=0;i<strlen(src);++i) printf("dst[%i]='%c'\n",i,dst[i]);
free(dst);
return 0;
}
donne bien : (mando@polgara) (~) $ ./a.out src = tapir dst = dst[0]='' dst[1]='a' dst[2]='p' dst[3]='i' dst[4]='r' En espérant que tout ceci a éclairé ta lanterne ;) |