PDA

Visualizza la versione completa : [C] stringhe come parametri di funzioni o come variabili globali


ilmo lesto
30-05-2007, 14:39
enuncio il mio problema:
ho una stringa puntata da un puntatore, poniamo char *string.

il fatto è che il mio programma è composto, oltre che dalla funzione main, da altre funzioni, a loro volta contenenti altre sottofunzioni.

visto che char *string verrebbe dichiarata nel main (e ho bisogno che L'INDIRIZZO DELLA STRINGA venga passato PER RIFERIMENTO), e visto che tale stringa mi serve anche nelle altre funzioni , mi trovo davanti ad un bivio...

dichiaro char *string nel main, e passo la striga come argomento alle varie funzioni? in questo caso però avrei funzioni che gestirei + difficilmente, visto che mi troverei ad avere un sacco di dereferenze (arriverei per esempio ad avere funzioni dichiarate in questo modo



void func (char ****string)


a causa dei continui passaggi della stringa da funzione a funzione...

oppure risolvo il problema dichiarando char *string come variabile globale?
epperò in questo modo contravvengo al principio del minimo privilegio?

avevo pensato anche a far ritornare alle varie funzioni un puntatore a stringa (char *). ma in alcune di quelle funzioni mi occore un valore di ritorno di tipo int...

MItaly
30-05-2007, 15:18
Tieni conto che passare per riferimento una stringa di rado ha una qualche utilità (se la funzione deve solo modificare la stringa che le viene passata basta passarle un char *), e comunque si raggiungono al massimo due dereferenziazioni (char **), non riesco a capire a cosa potrebbe servire un char ***.

ilmo lesto
30-05-2007, 16:08
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...



#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...)

ilmo lesto
30-05-2007, 18:50
penso di aver capito il concetto... credo proprio che non mi servano tutti questi deferimenti. mi basta passare il puntatore stesso ( e non il suo indirizzo), perchè non ho la necessità di eseguire modifiche sugli indirizzi...

frarugi87
30-05-2007, 18:55
non so se è quello che vuoi fare, ma dato che s nella prina funzione è già un puntatore, puoi fare così:



void func1 (char *s);
void func2 (char *s);
void func3 (char *s);

main()
{
char *tokenptr = NULL;
...
func1 (tokenptr);
}


void func1(char *s)
{
...
func2 (s);
}

void func2(char *s)
{
...
func3 (s);
}

void func3(char *s)
{
...
printf ("La stringa è %s", s);
}


Non c'è bisogno di passare sempre l'indirizzo se il puntatore non deve essere modificato.. se devi modificare la stringa il puntatore rimane sempre uguale. quando chiami la strtok fai

s = strtok(..)
e non
*s = strtok(..)...

Loading