Je dois réécrire pour une assignation une fonction qui imite le comportement du Strncpy, après de nombreuses essais et erreurs, une aide externe, voici le code final:
int main() { char str[] = "test de chaine"; char *str2 = "chaine de test"; ft_strncpy(str, str2, 6); printf("%s", str); return 0; } char *ft_strncpy(char *dest, char *src, unsigned int n) { unsigned int i; unsigned int size; i = 0; size = 0; while (src[i] && i < n) { dest[i] = src[i]; i++; } dest[n-1] = '\0'; return (dest); }
3 Réponses :
Strncpy () code>
est spécifié comme écrit exactement n code> octets, indépendamment de la longueur de la chaîne source.
strncpy(dst, "foo", 5); // writes 'f', 'o', 'o', 0, and 0
strncpy(dst, "foo", 3); // writes 'f', 'o', and 'o': dst is not a string now (*)
strncpy(dst, "foo", 1); // write 'f': dst is not a string now (*)
// (*) unless you make sure there is a '\0' somewhere else in dst
... et sans le second pendant code> boucle, la fonction n'écrira que
strallen (src) code> octets.
La valeur de je devrais être (n-1) non? P>
Ce n'est pas nécessairement le cas, car le premier
tandis que code> boucle est sorti lorsqu'il rencontre un caractère
\ 0 code> (même si
i code> est moins que
n-1 code>). p>
Le
tandis que code> -Loop est utilisé pour vous assurer que le reste du tableau code> est correctement initialisé à
\ 0 code>. p>
le comportement "mauvais" que vous voyez (la chaîne étant imprimée au-delà de la fin de la chaîne copiée) est due au fait que les deux boucles sortent avec La même condition: la première boucle quitte lorsque
i code> devient
n code> et puisque la seconde boucle a la vérification
i
, il ne fonctionne pas. p> Ceci correspond au comportement décrit dans le manuel: P>
La fonction strncpy () em> est similaire, sauf que, à la plupart des
N code> d'octets de
SRC code> sont copiés. AVERTISSEMENT: S'il n'y a pas d'octet nul entre le premier
N code> octets de
src code>, la chaîne placée dans
Dest code> ne sera pas terminée de null. blockquote>
Si vous deviez copier une chaîne
str code> avec la valeur
abc code>, il l'afficherait correctement dans l'exemple ci-dessous: P>
#include <stdio.h> char *ft_strncpy(char *dest, char *src, unsigned int n) { unsigned int i; unsigned int size; i = 0; size = 0; while (src[i] && i < n) { dest[i] = src[i]; i++; } while (i < n) { dest[i] = '\0'; i++; } return (dest); } int main() { char str[] = "test de chaine"; char *str2 = "abc"; ft_strncpy(str, str2, 6); printf("%s\n", str); return 0; }
Lorsque vous avez un tampon transmis comme un paramètre paramètre pour écrire des choses, vous devez toujours avoir un autre paramètre pour la taille de ce tampon.
@Tsakirogloufotis est vrai en général, mais la fonction C-Library Strncpy CODE> ne fonctionne pas, car elle suppose que le tampon de destination est assez grand (de nombreuses fonctions de la bibliothèque C supposent que ceci), c'est pourquoi est acceptable dans le cas d'une réimplémentation comme celle-ci.
Voulez-vous dire Strcpy? Parce que -n- dans Strncpy est la taille.Il est la vérité que Strcpy suppose qu'il y a suffisamment d'espace. Je parlais cependant pour la fonction que nous faisons, comme FT_StrnCy ici.
Je voulais dire que strncpy code> ne se soucie pas vraiment de la taille des tampons, mais seulement la quantité de caractères que vous souhaitez copier. Il est toujours possible de garantir que le nombre d'octets copiés est correct (ce qui n'est qu'une façon différente de s'assurer que la condition d'arrêt sera remplie, de la même manière, nous devons nous assurer qu'il existe un octet nul à la fin de la tampon avec
strcpy code>). Vous devez toutefois corriger que l'utilisation d'un argument de taille tampon est la bonne pratique dans C.
Cas d'angle ayant échoué: le code est UB lorsque n == 0 code> et tentatives de code
tandis que (src [0] && ... code> mieux utiliser
tandis que (i
Strncpy (Char * Dest, const Char * src, Taille_t N) Code> Utilise
Taille_t code>, pas
non signé INT N CODE>.
Vous devez comprendre que lorsqu'ils ont l'air similaire, un tableau de caractères n'est pas une chaîne tandis qu'une chaîne est une chaîne de charret.Some (c.-à-d. String.h celles) lira chaque octe après l'autre et s'arrêtera quand ils Rencontre '\ 0'.So Vérifiez cet exemple et vous aurez une vue différente.
int main() { char str3[] = "This is a test"; printf("\n %s", str3); str3[5] = '\0'; printf("\n %s \n", str3); int i = 0; for(i = 0 ; i < strlen(str3) ; i ++) { printf(" %c -",str3[i] ); } printf("\n"); for(i = 0 ; i < 12 ; i ++) { printf(" %c -",str3[i] ); } return 0; }
Quand ils font essentiellement la même chose i> - une hypothèse incorrecte. Voir Strings Null terminés .
Essayez ceci:
char x [] = "One \ 0 \ 0 \ 0TWO \ 0three"; printf ("% s% s% s \ n", x, x + 6, x + 10); code> ( Ideone )
Vous n'avez pas à retourner le tampon que vous écrivez. Vous pourriez avoir un retour sur si elle a été réussie ou non.
"Cela fonctionne parfaitement" -> non.