Pourquoi dois-je d'abord utiliser strcpy() avant strcat()?

pourquoi ce code produit-il des problèmes d'exécution:

char stuff[100];
strcat(stuff,"hi ");
strcat(stuff,"there");

mais cela ne veut pas?

char stuff[100];
strcpy(stuff,"hi ");
strcat(stuff,"there");
22
demandé sur Or Cyngiser 2013-09-17 03:20:41

5 réponses

strcat recherchera le terminateur nul, interprétera cela comme la fin de la chaîne, et y ajoutera le nouveau texte, écrasera le terminateur nul dans le processus, et écrira un nouveau terminateur nul à la fin de la concaténation.

char stuff[100];  // 'stuff' is uninitialized

Où est le terminator null? stuff n'est pas initialisé, donc il pourrait commencer avec NUL, ou il pourrait ne pas avoir NUL n'importe où dans lui.

En C++, vous pouvez faire ceci:

char stuff[100] = {};  // 'stuff' is initialized to all zeroes

Maintenant vous pouvez faire strcat, parce que le premier caractère de 'stuff' est le null-terminator, donc il sera ajouté au bon endroit.

En C, vous avez encore besoin d'initialiser "trucs", ce qui peut être fait de deux manières:

char stuff[100]; // not initialized
stuff[0] = ''; // first character is now the null terminator,
                 // so 'stuff' is effectively ""
strcpy(stuff, "hi ");  // this initializes 'stuff' if it's not already.
32
répondu Tim 2013-09-16 23:24:13

Dans le premier cas, stuff contient des ordures. strcat nécessite à la fois la destination et la source pour contenir des chaînes null-terminated appropriées.

strcat(stuff, "hi ");

scan stuff pour une terminaison '' caractère, où il commencera à copier "hi ". S'il ne le trouve pas, il s'exécute à la fin du tableau, et arbitrairement de mauvaises choses peuvent se produire (i.e., le comportement n'est pas défini).

Une façon d'éviter le problème, c'est comme ceci:

char stuff[100];
stuff[0] = '';      /* ensures stuff contains a valid string */
strcat(stuff, "hi ");
strcat(stuff, "there");

Ou vous pouvez initialiser stuff pour une chaîne vide:

char stuff[100] = "";

qui remplira les 100 octets de stuff avec des zéros (la clarté accrue vaut probablement n'importe quel problème mineur de performance).

5
répondu Keith Thompson 2013-09-16 23:25:08

Parce que stuff n'est pas initialisé avant l'appel à strcpy. Après la déclaration stuff n'est pas une chaîne vide, c'est des données non initialisées.

strcat ajoute des données à la fin d'une chaîne - c'est qu'il trouve le terminateur null dans la chaîne et ajoute des caractères d'après. Une chaîne non initialisée n'est pas garantie d'avoir un terminator null donc strcat risque de s'écraser.

Si il n'y avait pour initialiser stuff comme ci-dessous vous pouvez effectuer le strcat:

char stuff[100] = "";
strcat(stuff,"hi ");
strcat(stuff,"there");
0
répondu shf301 2013-09-16 23:28:10

Strcat ajoute une chaîne à une chaîne existante. Si le tableau string est vide, il ne va pas trouver find of string ('') et cela causera une erreur de temps d'exécution.

selon la page de manuel de Linux, simple strcat est implémenté de cette façon:

   char*
   strncat(char *dest, const char *src, size_t n)
   {
       size_t dest_len = strlen(dest);
       size_t i;

       for (i = 0 ; i < n && src[i] != '' ; i++)
           dest[dest_len + i] = src[i];
       dest[dest_len + i] = '';

       return dest;
   }

comme vous pouvez le voir dans cette implémentation, strlen(dest) ne sera pas de retour de corriger la longueur de la chaîne, sauf si dest est initialisé pour corriger les valeurs de la chaîne C. Vous pouvez avoir de la chance d'avoir un tableau avec la première valeur de zéro à char stuff[100];, mais il ne faut pas s'y fier.

0
répondu sung 2013-09-16 23:34:01

aussi, je déconseille l'utilisation de strcpy ou strcat comme ils peuvent conduire à certains problèmes involontaires.

Utiliser strncpy et strncat, car ils aident à prévenir les débordements de tampon.

0
répondu Mark Joseph Jorgensen 2013-09-17 23:23:40