En revoyant le code, j'ai effectivement raconté des conneries. 
Les post-incrémentations ne renvoient que la valeur de l'entier avant de l'incrémenter.
Du coup, mauvaise idée de faire tab[j][k++] . La ligne 81 était bonne de base.
Ça m'étonne qu'on t'interdise free() . À chaque fois que tu alloues de la mémoire, faut la libérer une fois que t'as fini de l'utiliser. J'vois pas pourquoi ils t'en empêcheraient. Tu crées une fonction qui libère les chaînes de caractères puis le tableau . T'appelles ça à la fin du programme. C'est peut-être pas la cause de l'erreur mais ça t'éviteras d'avoir d'autres problèmes par la suite.
En regardant la fonction nombre_mots() , entre la ligne 51 et 54 de ce que je comprends : tu parcours toute la chaîne de caractères quand tu rencontres un séparateur, puis tu incrémentes le nombre de mots et i une fois sorti de la 2eme boucle while . Mais que se passe-t-il quand tu rencontres que des lettres ? Ça passe jamais dans la 2eme boucle while , du coup ça incrémente toujours le nombre de mots à chaque fois que tu vois qu'une lettre est suivi d'une autre ?
Mon intuition me dit qu'il manque quelque chose.
Sinon as-tu testé pour différentes strings à parser ? Ça plante à quel moment dans le code ?
Sinon tu peux toujours utiliser une debugger basique comme GDB ou celui de l'IDE si t'en utilises un. Place un point d'arrêt au début de ta fonction ft_split_whitespaces() . Rentre bien dans la fonction et regarde ligne par ligne s'il le faut, utilise les watchers pour voir comment se comportent les différentes variables.