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