strtok() question: Si les jetons sont délimités par des séparateurs,pourquoi est le dernier jeton entre le séparateur et le nul '\0'?

Dans le programme suivant, strtok() fonctionne comme prévu dans la majeure partie, mais je ne peux pas comprendre la raison derrière une conclusion. J'ai lu sur strtok() que:

Pour déterminer le début et la fin d'un jeton, la fonction première des analyses à partir de l'emplacement de départ pour le premier caractère ne figurant pas dans les délimiteurs (qui devient le début du jeton). Et puis les scans à partir de ce début de jeton pour le premier caractère figurant dans les séparateurs, qui devient à la fin du jeton.

Source: http://www.cplusplus.com/reference/cstring/strtok/

Et comme nous le savons, strtok() place un \0 à la fin de chaque jeton. Mais dans le programme suivant, le dernier, le séparateur est un point(.), après quoi il est Crapaud entre ce point et le guillemet ("). Maintenant que le point est un délimiteur dans mon programme, mais il n'y a pas de délimiteur après Crapaud, même pas un espace blanc (qui est un délimiteur dans mon programme). Veuillez effacer la confusion suivante découlant de cette prémisse:

Pourquoi est strtok() considérant Crapaud, à titre symbolique, même si elle n'est pas entre les 2 séparateurs? C'est ce que j'ai lu sur strtok() lorsqu'il rencontre un caractère NULL (\0):

Une fois le caractère de fin null de str a été trouvé dans un appel à strtok, tous les appels à cette fonction avec un pointeur null en tant que premier argument retourner un pointeur null.

Source: http://www.cplusplus.com/reference/cstring/strtok/

Nulle part il n'est dit qu'une fois un caractère nul est rencontré,un pointeur vers le début de l'jeton est renvoyé (nous n'avons même pas un jeton d'ici tant que nous n'avons pas eu une fin de le jeton comme il n'y a pas de délimiteur de caractère après le scan commencé depuis le début du jeton (c'est à dire de " T " de Crapaud), nous n'avons trouvé qu'un caractère null, pas un délimiteur). Alors pourquoi est le partie entre le dernier délimiteur et le guillemet de la chaîne d'argument considéré comme un jeton par strtok()? Veuillez expliquer cela.

Code:

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

int main ()
{
  char str[] =" Falcon,eagle-hawk..;buzzard,gull..pigeon sparrow,hen;owl.Toad";
  char * pch=strtok(str," ;,.-");

    while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ;,.-");
  }

  return 0;
}

De sortie:

Falcon

aigle

hawk

buse

mouette

pigeon

moineau

poule

chouette

Crapaud

  • Pas sûr de comprendre votre question; quelle sortie vous attendiez-vous? Que Toad ne serait pas être imprimé? En passant par cette logique, si vous retirez de l'espace dans la chaîne d'entrée, Falcon ne devrait pas être imprimés. Je dirais que le fait pour certains des comportements non-intuitifs.
  • Si vous avez supprimé le vide avant de le Faucon, strtok() serait encore envisager de "Faucon", pour être le premier jeton.
  • J'ai délibérément fait.Comme je l'ai dit ,tout est comme prévu à partir de strtok(),sauf le dernier jeton,qui n'est clairement pas entre les deux délimiteurs.
  • Je regrette de l'avoir eu à aller à l'extérieur juste après l'affichage de cette question.
  • Pourquoi ne devrais-je pas attendre la Falcon à imprimer?Je l'ai mentionné à partir de la source que the function first scans from the starting location for the first character not contained in delimiters..c'est à dire,pour le début de l'jeton nous n'avons pas besoin d'un séparateur(espace est un délimiteur dans mon programme),mais pour marquer la fin du jeton, nous avons clairement besoin un délimiteur,et NULLE en fin de chaîne n'est pas sur la liste délimiteur.
  • Je suis surpris, je ne pouvais pas transmettre mon point de même pour vous à cette question.