web-dev-qa-db-fra.com

Commentaire copieur char * str sur char c [] en C?

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, "#");
9
Alex Xander

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;
}
17
pmg
char *str = "Hello";
char c[6];
strcpy( c, str );
2
Paul Mitchell

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.

1

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);
0
bua

É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 )

0
dstibbe

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);
0
Johan Soderberg