Inizia col leggere
questo thread per chiarirti un po' le idee.
Hai sbagliato il tipo di parametri passati alla procedura (void function). Se devi restituire un puntatore a char, il cui contenuto viene modificato dalla procedura stessa, dovresti passare un puntatore a puntatore a char. Ma questo è comunque erroneo, dato il comportamento della strtok() illustrato appunto nel link sopra presentato. In realtà, a te serve una copia dell'intera sottostringa in un buffer, che sarà poi restituito al chiamante (e qui nasce anche il problema di deallocare la relativa memoria, o piuttosto di passare ad una variabile con diverso scope)
In realtà dovrai correggere i tuoi errori di impostazione seguendo
una di queste asseverate strategie di design. Tipicamente, potrai passare un puntatore ad una struct che contiene un unsigned int (equivalentemente, size_t) per la lunghezza massima, e un buffer (array di char) di dimensione prudenziale, che conterrà copia della "parola" più lunga estratta dalla stringa di testo.
In sostanza, qualcosa del seguente tenore:
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 64
typedef struct {
char buff[BUF_SIZE];
size_t len;
} parola_t;
void parolamax(char *testo, parola_t *output)
{
size_t max = 0;
char *p;
p = strtok(testo, " ");
while(NULL != p)
{
size_t len = strlen(p);
if(len > max)
{
max = len;
output->len = len;
strcpy(output->buff, p);
}
p = strtok(NULL, " ");
}
}
int main(void)
{
char *stringa = "Asd lollo silvestro serena";
parola_t parola_max;
parolamax(stringa, &parola_max);
printf("La parola piu' lunga e' [%s] di dimensione %d\n",
parola_max.buff, parola_max.len);
return 0;
}
L'esempio, strettamente basato sul codice presentato, ha poi ampissimi margini di miglioramento. Ma per il momento possiamo fermarci qui.