Salve a tutti, ho la necessità creare un array di stringhe utilizzando un doppio puntatore. Come posso allocare dinamicamente ogni singola parola se non ne conosco la lunghezza a priori? (il numero delle parole mi è noto, invece).
Salve a tutti, ho la necessità creare un array di stringhe utilizzando un doppio puntatore. Come posso allocare dinamicamente ogni singola parola se non ne conosco la lunghezza a priori? (il numero delle parole mi è noto, invece).
Con la funzione getchar in un ciclo for e malloc e realloc per la gestione della memoria, oppure con scanf un array provvisorio per lo storing della parola un controllo sulla lungezza e realloc in un ciclo for.
Se non hai capito bene chiedi pure =)
In questo modo avrei lo stesso problemi nel definire a priori le dimensioni dell'array temporaneo....Originariamente inviato da Scara95
con scanf un array provvisorio per lo storing della parola un controllo sulla lungezza e realloc in un ciclo for.
Mi informo un pò su realloc ( che non ho mai usato ) e ti faccio sapere...grazie per l'interessamento comunque!![]()
No, basterebbe una variabile di dimensioni standard che possa contenere tutte le parole, ad esempio credo che 15 caratteri siano più che sufficenti, e quindi, dopo l'inserimento della parola, controlli la lunghezza di questa, reallochi con realloc la memoria necessaria a contenere la parola e l'aggiungi a l'array copiandola dall'altro...
si, ho capito cosa intendevi ma mi ritroverei comunque ad escludere parole più lunghe del limite prescelto ( per quanto questo possa essere ragionevole ) .Originariamente inviato da Scara95
No, basterebbe una variabile di dimensioni standard che possa contenere tutte le parole, ad esempio credo che 15 caratteri siano più che sufficenti, e quindi, dopo l'inserimento della parola, controlli la lunghezza di questa, reallochi con realloc la memoria necessaria a contenere la parola e l'aggiungi a l'array copiandola dall'altro...
Comunque per quanto riguarda l'altro metodo, se ho capito bene dici di fare così giusto?
-leggo carattere per carattere con getchar() ponendo come terminazione '\n'
-ad ogni lettura di carattere diverso da '\n' aumento di uno lo spazio allocato in precedenza con realloc
giusto?![]()
Esatto, solo di consiglio di mettere una variabile contatore e riallocare ogni tot caratteri, altrimenti per il sistema diventa impegnativo, poi prova a fare dei test, dipende anche dalla quantità di informazioni che devi trattare![]()
Giusto!
Grazie ancora![]()
Il sistema è comunque troppo dipendioso, lo puoi fare per esercizio ma se parli di efficienza la realloc causa sempre una chiamata di sistema.
Puoi limitare il numero di caratteri presi in input con fgets (che puoi cercare nella documentazione), e ad ogni stringa presa in input allocare memoria e copiarla.
Vedi se questa discussione
http://forum.html.it/forum/showthrea...readid=1504352
ti può dare una mano
No MP tecnici (non rispondo nemmeno!), usa il forum.
Ho capito il discorso anche grazie al link di Oregon ( grazie ). Per il momento voglio lasciar perdere il fattore efficienza...Quello che ho scritto, per esercizio, è questo :Originariamente inviato da Who am I
Il sistema è comunque troppo dipendioso, lo puoi fare per esercizio ma se parli di efficienza la realloc causa sempre una chiamata di sistema.
Puoi limitare il numero di caratteri presi in input con fgets (che puoi cercare nella documentazione), e ad ogni stringa presa in input allocare memoria e copiarla.
Il problema: Le lettere in posizione multipli di 6 non compaiono nella stampa. Ho provato simulazione su carta ma non ho trovato nessun errore, potete darmi una mano?codice://prova funzionamento REALLOC #include <stdio.h> #include <stdlib.h> #include <string.h> #define num 3 //definisco ogni quanto usare realloc int main() { char *p; int i=0; int k=num; char v[11]; char c; p=(char*)malloc(sizeof(char)*num); *p='\0'; //metto il tappo all'inzio per sfruttare strcat printf("Inserire la parola\n"); while((c=getchar())!='\n') { if(i<num) { v[i]=c; i++; } else { k=k+num; v[i]='\0'; p=(char*)realloc(p,sizeof(char)*k); strcat(p,v); i=0; } } if(i!=0) //caso in cui esce dal ciclo prima di aver allocato "num" elementi { v[i]='\0'; strcat(p,v); } printf("La parola letta e' : %s \n",p); return EXIT_SUCCESS; }