2014-06-16 13 views
1

J'essaie de comprendre pourquoi ce code me donne une erreur de segmentation!
research est une chaîne et elle imprime mes jetons, mais après cela, j'ai une erreur de segmentation.
Pourriez-vous m'aider s'il vous plait?Segmentation fault strtok

char buf[MAX_CHARS_PER_LINE]; 
strcpy(buf, research.c_str()); 

int n = 0; 
const char * token[MAX_TOKENS_PER_LINE] = {}; 

for (n = 0; n < MAX_TOKENS_PER_LINE; n++) 
{ 
    if (n == 0) token[0] = strtok(buf, DELIMITERS); 
    else token[n] = strtok(0, DELIMITERS); 

    if (!token[++n]) break; 

    printf("%s\n", token[n]); 
} 
+1

Que faire s'il n'y a pas de jetons 'MAX_TOKENS_PER_LINE'? –

+3

En plus du commentaire de Blue Moon ci-dessus, vous semblez également ajouter deux fois 1 à n - une fois dans la boucle for et une fois sur la ligne de break. Je ne sais pas si c'est prévu ou non? – FreudianSlip

+0

Il est difficile de croire que cela devrait même imprimer les premiers jetons ... – laune

Répondre

2

Pas de pré-incrémentation

if (!token[n]) break; 

Toujours utiliser strncpy lors de la copie d'un tableau de caractères de longueur fixe - pas strcpy.

+2

+1, mais je suggère: "' n' est déjà incrémenté dans votre boucle for "au lieu de" Pas de pré-incrément " –

1

Désolé, mais vous abordez ce problème d'une manière très compliquée et vous semblez perdre la vue.

char buf[MAX_CHARS_PER_LINE] = {0}; /* Intialise the array properly. */ 
strncpy(buf, research.c_str(), MAX_CHARS_PER_LINE - 1); /* Take care to not overflow the target. */ 

size_t n = 0; /* size_t is the proper type to index arrays. */ 
const char * token[MAX_TOKENS_PER_LINE] = {}; 

token[n] = strtok(buf, DELIMITERS); 
while (token[n] && (n < (MAX_TOKENS_PER_LINE - 1)) 
{ 
    n++; 

    token[n] = strtok(0, DELIMITERS); 

    printf("%s\n", token[n]); 
}