0
votes

Pourquoi cette mise en œuvre de "Strncpy" fonctionne-t-elle?

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


4 commentaires

Quand ils font essentiellement la même chose - 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); ( 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.


3 Réponses :


1
votes

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


1 commentaires

... et sans le second pendant boucle, la fonction n'écrira que strallen (src) octets.



1
votes

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


6 commentaires

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 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 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 ). 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 et tentatives de code tandis que (src [0] && ... mieux utiliser tandis que (i


Strncpy (Char * Dest, const Char * src, Taille_t N) Utilise Taille_t , pas non signé INT N .



0
votes

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


0 commentaires