copier une chaîne dans une autre chaîne en C

char *ssortingngcopywithpointer( const char *source) { int ii = 0; int len = strlen(source) +1; char *dest = (char*)malloc(sizeof(char)*len); while(*source != '\0') { // dest[ii++] = *source++; *dest++ = *source++; } // dest[ii] = '\0'; *dest = '\0'; printf("\n copied ssortingng = %s", dest1); return dest; } 

Je veux copier la chaîne source dans la chaîne de destination. L’API ci-dessus renvoie la valeur null. Si j’utilise un tableau de caractères (j’ai commenté cela), alors cette API fonctionne pour moi.

S’il vous plaît aidez-moi à comprendre la différence entre

 dest[ii++] = *source++ 

et

 *dest++ = *source++; 

Vous augmentez votre dest pendant la boucle while. Vous devez garder un pointeur sur le début de la mémoire tampon pour revenir de la fonction.

 char *ssortingngcopywithpointer( const char *source) { int ii = 0; int len = strlen(source); char *copy = malloc(len+1); char* dest = copy; while(*source != '\0') { *dest++ = *source++; } *dest = '\0'; printf("\n copied ssortingng = %s", copy); return copy; } 

Notez que vous pouvez enregistrer du code en utilisant strcpy

 char *ssortingngcopywithpointer( const char *source) { int len = strlen(source); char *copy = malloc(len+1); strcpy(copy, source); return copy; } 

et vous pouvez le réduire à une seule ligne si vous avez access au strdup non standard

 char *ssortingngcopywithpointer( const char *source) { return strdup(source); } 

Mon avis:

Éviter d’allouer de la mémoire dans la fonction appelée, mieux allouer de la mémoire avant d’appeler une fonction

 char *dest = ( char* ) malloc( sizeof( char ) * len ); // doesn't looks great 

Indépendamment de la machine, sizeof( char ) est toujours de 1 octet. sizeof( char ) * len est moins redondant. Optimal serait malloc( sizeof( source ) ) .

Les pointeurs et les tableaux sont liés Vous pouvez soit utiliser

 dest[i] = src[i]; *dst++ = *src++; 

ou

 // assuming dst memory allocate by caller while ( *dst++ = *src++); 

1)

 printf("\n copied ssortingng = %s", dest1); 

devrait être

 printf("\n copied ssortingng = %s", dest); 

Cela pourrait être une faute de frappe

2)

Vous pouvez changer:

 while(*source != '\0') { *dest++ = *source++; } 

par

 while(*dest++ = *source++); 

3)

Concernant la différence entre dest[ii++] = *source++ et *dest++ = *source++;

Il n’y a pas de différence et devrait fonctionner si dest est défini de cette façon

 char *dest = (char*)malloc(sizeof(char)*len); 

Si votre tableau est défini de cette manière:

 char dest[len]; 

Ensuite, il y a une différence

Vous ne devriez pas retourner une chaîne allouée. Cela peut facilement conduire à une fuite de mémoire.

Au lieu de cela, vous devriez envisager de transmettre la mémoire allouée à votre fonction pour la copier. Vous pouvez utiliser votre valeur de retour pour renvoyer une erreur en cas de problème.

Cela changerait votre signature en.

 int ssortingngcopywithpointer( char * dest, const char *source) 

pour rendre votre code un peu plus polyvalent, vous pouvez implémenter vargs et votre signature serait:

 int ssortingngcopywithpointerf( char * dest, const * format, ... ); 

C’est en fait la fonction sprintf déjà existante.

 int sprintf( char * dest, const * format, ... ); 

Il existe également des variantes sécurisées de la fonction disponibles et prédéfinies. Vous voudrez peut-être envisager d’utiliser l’un de ceux-ci.

Si cela concerne les devoirs, jetez un coup d’œil à cette fonction:

 char * myscpy(const char * SRC){ size_t size = strlen( SRC ) + 1 ; char * START; char * DST = ( char * ) malloc( size ); START = DST; do { *DST = *SRC; DST++; SRC++; }while( *SRC != 0 ); *DST = *SRC; return START; } 

Vous voudrez probablement y append des vérifications d’erreur comme si vous les aviez mises en place (malloc, etc.) dans votre message d’origine.


“Aidez-moi à comprendre la différence entre dest [i ++] et * dest ++”

dest [i ++] n’incrémente pas le pointeur mais l’index du pointeur. * dest ++ incrémente le pointeur après avoir accédé à son contenu d’origine.

Ajoutez char *dest1 = dest; juste après malloc puis retournez dest1 et cela fonctionnera.

Autre changement possible: remplacer la boucle while par la boucle post-condition (c.-à-d. Copier d’abord l’octet zéro, puis vérifier si c’était la fin).

peut-être que vous devez append cette ligne

 char *ssortingngcopywithpointer( const char *source) { int ii = 0; int len = strlen(source) +1; char *ptr = NULL; char *dest = (char*)malloc(sizeof(char)*len); /** No Error Checking for malloc is a ssortingct no no **/ if(dest == NULL) return NULL; /** hold the dest adress in ptr as we are incrementing dest **/ ptr = dest; while(*source != '\0') { // dest[ii++] = *source++; *dest++ = *source++; } // dest[ii] = '\0'; *dest = '\0'; //printf("\n copied ssortingng = %s", dest1); ?? printf("\n copied ssortingng = %s", ptr); // ptr will have our copied Ssortingng /** so return ptr not dest **/ return ptr; }