cercherò di spiegare il concetto con un esempio pratico, in effetti faccio fatica pure io a focalizzare il problema, quindi mi trovo un po' spiazzato
ho una stringa che deve essere suddivisa in token. per la suddivisione in token utilizzo strtok. il fatto è che le chiamate a strtok avvengono, non solo nel main, ma le chiamate successive avvengono in altre sottofunzioni. se io non passassi l'indirizzo del puntatore (che ho chiamato tokenPtr) che punta al token, accadrebbe che i token verrebbero comunque individuati nelle varie sottofunzioni, ma quando ritorno al main, la variabile puntatore tokenPtr conterrebbe ancora l'indirizzo del primo token trovato (quello prodotto dalla chiamata che si trova nel main)
se invece faccio come dicevo io, alla fine, quando il controllo ritorna al main, la variabile tokenPtr conterrebbe effettivamente l'indirizzo che punta all'ultimo token individuato dalla chiamata strtok...
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void func1 (char **s);
void func2 (char ***s);
void func3 (char ****s);
int main (){
char string[] = "uno due tre quattro cinque";
char *tokenPtr = NULL; //puntatore per isolare un token
puts (string);
tokenPtr = strtok (string, " "); //individuo il primo token
puts (tokenPtr); //visualizzo "uno"
func1 (&tokenPtr); //passo l'indirizzo del puntatore tokenPtr
/*in questo caso tokenPtr punta alla stringa "quattro", se non avessi passato l'indirizzo
della stringa a questo punto tokenPtr conterrebbe ancora "uno"*/
printf("\nin main, dopo il passaggio nelle 3 funzioni il contenuto di tokenPtr risulta:%s\n",
tokenPtr);
return 0;
}
void func1 (char **s){
*s = strtok (NULL, " "); //individuo il secondo token
printf("\ndentro func1 tokenPtr:%s\n", *s);
func2 (&s);
printf("\ndopo func2 tokenPtr:%s\n", *s);
return;
}
void func2 (char ***s){
**s = strtok (NULL, " ");
printf("\ndentro func2 tokenPtr:%s\n", **s);
func3 (&s);
printf("\ndopo func3 tokenPtr:%s\n", **s);
return;
}
void func3 (char ****s){
***s = strtok (NULL, " ");
printf("\ndentro func3 tokenPtr:%s\n", ***s);
return;
}
la mia domanda è se esiste un modo che non sia questo, per permettere al puntatore tokenPtr dichiarato nel main, di assumere l'indirizzo restituito dall'ultima chiamata di strtok in func3...
chiedo scusa anticipatamente se ci sono inesattezze nel codice, ma ho fatto tutto di fretta (comunque a me funziona...)