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");
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.
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).
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");
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.
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.