Essayer de copier un char *str
dans char c[]
, mais en obtenant une erreur de segmentation ou une erreur d’initialisation invalide.
Pourquoi ce code me donne-t-il un seg faute ?
char *token = "some random string";
char c[80];
strcpy( c, token);
strncpy(c, token, sizeof c - 1);
c[79] = '\0';
char *broken = strtok(c, "#");
utilisez strncpy()
plutôt que strcpy()
/* code not tested */
#include <string.h>
int main(void) {
char *src = "gkjsdh fkdshfkjsdhfksdjghf ewi7tr weigrfdhf gsdjfsd jfgsdjf gsdjfgwe";
char dst[10]; /* not enough for all of src */
strcpy(dst, src); /* BANG!!! */
strncpy(dst, src, sizeof dst - 1); /* OK ... but `dst` needs to be NUL terminated */
dst[9] = '\0';
return 0;
}
char *str = "Hello";
char c[6];
strcpy( c, str );
utilisez strncpy pour être sûr de ne pas copier plus de caractères que ce que le caractère [] peut contenir
char *s = "abcdef";
char c[6];
strncpy(c, s, sizeof(c)-1);
// strncpy is not adding a \0 at the end of the string after copying it so you need to add it by yourself
c[sizeof(c)-1] = '\0';
Edit: Code ajouté à la question
En regardant votre code, la faute de segmentation pourrait se faire par la ligne
strcpy(c, token)
Le problème est que si la longueur du jeton est supérieure à la longueur de c, la mémoire est remplie à partir de la variable de c et cela cause des problèmes.
char c [] doit avoir une certaine taille;
par exemple
char c[]= "example init string";
// qui met en place la table c to c [19]; Vous pouvez l’allouer directement au début de votre programme;
char c[19] = {0}; // null filled table
car c [i] est le pointeur donc vous n'avez rien à copier; char c [19]; c = "exemple chaîne d'initialisation"; // maintenant & c [0] pointe la même adresse;
La copie peut être faite avec
strcpy(dst, src);
mais MS vous oblige à utiliser la fonction sécurisée:
strcpy_s(dst,buffsize,src);
Édité: Merci d'avoir ajouté le code.
Peut-être que la segfault se produit ici:
strncpy(c, token, sizeof c - 1);
sizeof a la même priorité que '-' de droite à gauche, il est donc probablement traité comme suit:
strncpy(c, token, sizeof( c - 1 ) );
au lieu de
strncpy(c, token, sizeof(c) - 1);
c'est probablement ce que tu voulais
(référence: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence )
Cela fait longtemps que je n'ai pas codé en c/c ++, mais c [80] est probablement alloué sur la pile. Si vous utilisez char * c et strdup ou similaire, vous l'obtenez alloué sur le tas où strtok peut y accéder.
Essayez quelque chose comme ça.
char *token = "some random string";
char *c;
c = strdup(token);
char *broken = strtok(c, "#");
free(c);