Comment tokeniser une chaîne contenant des valeurs NULL en utilisant strtok_r

J’ai une chaîne qui contient des valeurs séparées par des virgules. La valeur peut être ou ne pas être NULL. comme :

strcpy(result, "Hello,world,,,wow,"); 

Je veux que les valeurs nulles soient également acceptées. Comment puis-je continuer en utilisant strtok_r qui me donne aussi des valeurs NULL.

J’ai essayé ceci:

 #include  #include  #include  int main(void) { char result[512] = { 0 }; strcpy(result, "Hello,world,,,wow"); char *token, *endToken; int i = 0; token = strtok(result, ","); while (i < 5) { printf("%d\n", ++i); printf("%s\n", token); token = strtok(NULL, ","); } return 0; } 

et le résultat est:

 1 Hello 2 world 3 wow 4 Segmentation fault (core dumped) 

Je sais pourquoi il donne faute de segmentation. Je veux la solution pour que la sortie soit comme:

 1 Hello 2 World 3 * 4 * 5 wow 

Je veux * être imprimé pour les jetons nuls mais les jetons nuls ne sont même pas extraits.

De la page de manuel strtok_r:

Une séquence de deux ou plusieurs caractères de délimitation contigus dans la chaîne analysée est considérée comme un simple délimiteur.

Cela ne fonctionnera donc pas dans votre cas. Mais vous pouvez utiliser un code comme celui-ci:

 #include  #include  int main(void) { int i = 0; char result[512]; char *str = result, *ptr; strcpy(result, "Hello,world,,,wow"); while (1) { ptr = strchr(str, ','); if (ptr != NULL) { *ptr = 0; } printf("%d\n", ++i); printf("%s\n", str); if (ptr == NULL) { break; } str = ptr + 1; } return 0; } 

Si vous n’avez pas strsep() vous pouvez lancer le vôtre.

 #include  #include  #include  int main(void) { char result[512] = "Hello,world,,,wow"; char *token, *endToken; int i = 0; token = result; do { endToken = strchr(token, ','); if (endToken) *endToken = '\0'; // terminate token printf("%d\n", ++i); if (*token == '\0') // substitute the empty ssortingng printf("*\n"); else printf("%s\n", token); if (endToken) token = endToken + 1; } while (endToken); return 0; } 

Sortie du programme:

 1 Hello 2 world 3 * 4 * 5 wow 

Pour que strtok trouve un jeton, il doit exister un premier caractère qui ne soit pas un délimiteur. Il ne renvoie NULL que lorsqu’il atteint la fin de la chaîne, c’est-à-dire lorsqu’il trouve le caractère '\0' .

Pour déterminer le début et la fin d’un jeton, la fonction balaie d’abord à partir de l’emplacement de départ le premier caractère non contenu dans les délimiteurs (qui devient le début du jeton) . Puis, à partir de ce début du jeton, balaye le premier caractère contenu dans les délimiteurs, qui devient la fin du jeton. L’parsing s’arrête également si le caractère nul final est trouvé.

http://www.cplusplus.com/reference/cssortingng/strtok