2016-03-09 4 views
0
ici

est mon code,srtok ne fonctionne pas dans c

#include <string.h> 
#include <stdio.h> 

main() 
{ 
    explode (" ", "this is a text"); 
} 

    explode (char *delimiter, char string[]) 
{ 
char *pch; 
printf ("Splitting string \"%s\" into tokens:\n",string); 
pch = strtok (string,delimiter); 
while (pch != NULL) 
{ 
    printf ("%s\n",pch); 
    pch = strtok (NULL, delimiter); 
} 
return 0; 
} 

Je compile ce code à l'aide gcc -o 1.exe 1.c et ne montre aucune erreur. Mais quand j'exécute 1.exe il montre Splitting string "this is a text" into tokens: et à ce moment 1.exe cesse de fonctionner (une boîte de dialogue de spectacles de fenêtres). quelqu'un peut-il dire le problème et résoudre le problème? J'utilise Windows 10.

+4

double possible de [strtok donnant Segmentation Fault] (http://stackoverflow.com/questions/2385697/strtok-giving-segmentation-fault) –

+0

Ou celui-ci: http://stackoverflow.com/questions/2843236/strtok-programme-crashing. –

+0

Ce code est affreux! Veuillez lire un livre C moderne pour déclarer correctement une fonction et mettre en forme le code source. – Olaf

Répondre

2

Bien que vous ne puissiez pas le faire avec strtok car le littéral ne peut pas être modifié, cela peut être fait avec strcspn.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void explode (char *delimiter, char *string); 

int main() 
{ 
    explode (" ", "this is a text"); 
    return 0; 
} 

void explode (char *delimiter, char *string) 
{ 
    int span = 0; 
    int offset = 0; 
    int length = 0; 

    if (delimiter && string) { 
     length = strlen (string); 
     printf ("Splitting string \"%s\" into tokens:\n",string); 
     while (offset < length) { 
      span = strcspn (&string[offset],delimiter);//work from offset to find next delimiter 
      printf ("%.*s\n",span, &string[offset]);//print span number of characters 
      offset += span + 1;// increment offset by span and one characters 
     } 
    } 
} 
2

Dans votre fonction explode(), vous passez une chaîne liteal ("this is a text") et en utilisant la même que l'entrée strtok().

Comme strtok() modifie la chaîne d'entrée, ici, elle appellera undefined behavior. Comme il est mentionné dans e Si le programme tente de modifier un tel tableau C11 standard, chapitre §6.4.5, chaîne de littéraux

[...], le comportement est non défini.

Vous pouvez

  • Définir un tableau et initialiser avec la chaîne littérale et l'utilisation du tableau en entrée à strtok().
  • Pour prendre un pointeur, utilisez strdup() pour copier l'initialiseur, puis indiquez ce pointeur sur strtok().

La ligne du bas est, la chaîne d'entrée à strtok() devrait être modifiable.