Das ist sehr einfach zu erledigen.
Du schreibst dir, nachdem du dir über die wirklichen Zusammenhänge klar bist, eine (oder mehrere) Funktionen, die die Einzel- oder Gesamtaufgabe durchführen, und rufst sie dann an den entsprechenden Stellen auf.
Dabei sollten die Parameter möglichst flexibel sein und du solltest niemals globale Variablen stattdessen benutzen (sowas machen nur Deppen).
strtok ist auf jeden Fall der falsche Weg.
Ein Beispiel:
char **strliste(const char *s)
{
int i;
char b[100];
static int z;
static char **a;
if( !a ) a = calloc(1,sizeof*a);
if( !s )
return a;
if( 1!=sscanf(s,"%*s %99[^\n]",b) || strlen(b)<20 )
return 0;
for(i=0;i<z;++i)
if( !strncmp(a[i],b,17) ) return 0;
a=realloc(a,(++z+1)*sizeof*a);
a[z]=0;
a[z-1]=malloc(strlen(b)+1);strcpy(a[z-1],b);
return 0;
}
Bei Übergabe von != NULL (also strliste(buf)) verarbeitet die Funktion den String entsprechend und merkt ihn sich in einer lokalstatischen Stringliste;
bei Übergabe von NULL wird diese Liste zurückgegeben, d.h. NACH der Verarbeitung rufst du einmal strliste(NULL) auf und durchläufst die rückgegebene Stringliste bis NULL, also
char **s = strliste(0);
while( *s ) puts(*s++);
Das Ende der Stringliste selbst ist durch NULL gekennzeichnet, deshalb kannst du wie gezeigt while benutzen. Zum Schluss die Liste+Strings wieder freigeben (free).