Erreur de segmentation à l’aide de strcat

Voici mon code:

char *name, name_log="log-"; 

—— Obtenir le ‘nom’ de l’utilisateur —–

 strcat(name_log, name); char ext[] = ".log"; strcat(name_log, ext); 

Name_log = “log-‘name’.log” mais je reçois une erreur de segmentation: ((. Qu’est-ce que je fais mal et comment puis-je résoudre ce problème? Thx

Pour commencer, s’il s’agit de votre code:

 char *name, name_log="log-"; 

alors name_log est un caractère , pas un pointeur de caractère.

En supposant que ce soit une faute de frappe, vous ne pouvez pas append des littéraux de chaîne comme cela. Les modifications apscopes aux littéraux de chaîne constituent un comportement indéfini.

Pour une chaîne de taille variable, comme l’ user semble l’être, l’option la plus sûre consiste probablement à allouer une autre chaîne suffisamment grande pour contenir le résultat, comme suit:

 char *name, *name_log = "log-", *ext = ".log"; // Do something to allocate and populate name char *buffer = malloc (strlen (name_log) + strlen (name) + strlen (ext) + 1); if (buffer == NULL) { // Out of memory. } else { strcpy (buffer, name_log); strcat (buffer, name); strcat (buffer, ext); // Do something with buffer. free (buffer); } 

Le malloc s’assure que vous disposez de suffisamment d’espace pour effectuer toutes les opérations sur les chaînes en toute sécurité, de caractères pour les trois composants et d’un terminateur null.

les littéraux de chaîne se voient allouer une quantité fixe de mémoire, généralement dans une section en lecture seule, vous devez plutôt utiliser un tampon.

 char buffer[64] = "log-"; strncat(buffer,".log",32); 

Sur une note de côté, strcat est généralement dangereux, vous devez utiliser quelque chose qui vérifie la taille du tampon utilisé ou avec des limites sur ce qu’il peut concaténer, comme strncat .

Une solution complètement différente serait la suivante:

 const char *prefix = "log-"; const char *suffix = ".log"; // There's a "char *name" somewhere int size_needed; char *result; size_needed = snprintf(NULL, 0, "%s%s%s", prefix, name, suffix); result = malloc(size_needed + 1); snprintf(result, size_needed + 1, "%s%s%s", prefix, name, suffix); // "result" now contains the desired ssortingng. 

Ce qui est bien avec snprintf c’est qu’il renvoie le nombre de caractères qu’il écrirait s’il y avait assez d’espace. Cela peut être utilisé en mesurant immédiatement la quantité de mémoire à allouer, ce qui rend inutiles les calculs compliqués et sujets aux erreurs.

Si vous vous trouvez sur un système avec asprintf , c’est encore plus simple:

 char *result = NULL /* in case asprintf fails */; asprintf(&result, "log-%s.log", name); // "result" must be released with "free" 

vous devez allcocate la mémoire. Vous ne pouvez pas append de la sorte à une chaîne, car celle-ci va à la mémoire non allouée.

tu peux faire

 char[20] strarray; strcat(strarray, "log-"); strcat(strarray, "abcd"); 

name_log est pointé à un endroit statique: “log-“, ce qui signifie qu’il ne peut pas être modifié, alors que le premier paramètre de strcat() doit être modifiable.

essayez de changer le type char* de name_log en char[] , par exemple

 char[20] name_log = "log-";