Se il codice lo hai pensato così, dato che funziona, va bene così.
Introduci però come terminale di frase il carattere '\n', che è più naturale, quindi
if (*p == '!' || *p == '?' || *p == '.' || *p == '\n')
e
for (b = p; *b != ' '&&*b != '!'&&*b != '?'&&*b != '.'&& *b != '\n'; b++)
e in fondo al codice un bel ritorno carrello
printf("\n");