Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156

    [C] Allocazione dinamica stringhe

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

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    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 =)

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Originariamente inviato da Scara95
    con scanf un array provvisorio per lo storing della parola un controllo sulla lungezza e realloc in un ciclo for.
    In questo modo avrei lo stesso problemi nel definire a priori le dimensioni dell'array temporaneo....
    Mi informo un pò su realloc ( che non ho mai usato ) e ti faccio sapere...grazie per l'interessamento comunque!

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    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...

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    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...
    si, ho capito cosa intendevi ma mi ritroverei comunque ad escludere parole più lunghe del limite prescelto ( per quanto questo possa essere ragionevole ) .
    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?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Giusto!
    Grazie ancora

  8. #8
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    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.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    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.
    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 :
    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;
    }
    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?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.