En C, les fonctions de bibliothèque d'exécution strcpy
et strcat
ne nécessitent aucune chaînes terminées. Ce que vous leur remettez n'est pas terminé par zéro, et donc ces fonctions se bloqueront en raison de leur dépendance à l'égard de ce zéro de fin pour indiquer quand elles doivent s'arrêter. Ils parcourent la RAM jusqu'à ce qu'ils lisent un zéro, qui pourrait être n'importe où dans la RAM, y compris la RAM protégée en dehors de votre programme, provoquant un plantage. Dans un travail moderne, nous considérons que des fonctions telles que strcpy et strcat ne sont pas sûres. Tout type d'erreur en leur donnant des pointeurs provoque ce problème.
Les versions de strcpy et strcat existent, avec des noms légèrement différents, qui nécessitent un entier ou size_t indiquant leur taille maximale valide. strncat
, par exemple, a la signature:
char * strncat(char *destination, const char *source, size_t num);
Si, dans votre cas, vous aviez utilisé strncat, fournissant 4 pour le dernier paramètre, il ne serait pas écrasé.
Cependant, une alternative existe que vous préférerez peut-être explorer. Vous pouvez simplement utiliser l'indexation, comme dans:
char destination[5]; // I like room for a zero terminator here
for(i=0; i<4; i++)
destination[i] = grid[0][i];
Cela ne gère pas la terminaison zéro, que vous pouvez ajouter avec:
destination[4] = 0;
Maintenant, supposons que vous vouliez continuer, mettre les deux mots en une chaîne de sortie unique.Vous pourriez faire:
char destination[10]; // I like room for a zero terminator here
int d=0;
for(r=0; r<2; ++r) // I prefer the habit of prefix instead of postfix
{
for(i=0; i<4; ++i)
destination[d++] = grid[r][i];
destination[d++] = ' ';// append a space between words
}
Après tout traitement nécessaire sur ce qui pourrait être une déclaration toujours plus pour la destination, ajoutez une terminaison zéro avec
destination[ d ] = 0;
Comment pourrais-je aller sur la copie d'un char construire une chaîne puis? – RiGid
Quelqu'un devrait proposer 'chrcpy' au comité C pour combler cette lacune si nécessaire. Après tout, nous avons 'strchr' et' strstr'. –
@RiGid, Voir la mise à jour. – ikegami