Allocazioni dinamica di un array di stringhe

di il
24 risposte

Allocazioni dinamica di un array di stringhe

Ciao a tutti ragazzi, coma da titolo mi potete dire come faccio ad allocare dinamicamente un array di stringhe? Ho cercato su internet ma non trovo nulla di soddisfacente.

Grazie

24 Risposte

  • Re: Allocazioni dinamica di un array di stringhe

    Ciao, ecco un piccolo esempio scritto al volo:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_LENGTH 50
    
    int main()
    {
        char **array_stringhe;
        int numero_stringhe = 2;
        int i;
    
        array_stringhe = malloc(numero_stringhe * sizeof(char *));
        for(i=0; i<numero_stringhe; i++)
        {
            array_stringhe[i] = malloc(MAX_LENGTH * sizeof(char));
        }
    
        strcpy(array_stringhe[0], "pippo");
        strcpy(array_stringhe[1], "pluto");
    
        printf("Prima stringa: %s\n", array_stringhe[0]);
        printf("Seconda stringa: %s\n", array_stringhe[1]);
    
    
        return 0;
    }
    
    
  • Re: Allocazioni dinamica di un array di stringhe

    Grazie mille, era proprio quello che mi serviva
  • Re: Allocazioni dinamica di un array di stringhe

    Prego! Per altri dubbi siamo qui.

  • Re: Allocazioni dinamica di un array di stringhe

    Scusate ma devo chiedervi un'altra cosa.

    Se ad esempio io vorrei fare:
    1. Alloco 2 spazi
    2. Chiedo di inserire le stringhe
    3. Se ne vuole inserire più di due allora alloco 2(di prima)*2
    4. Chiedo di inserire le stringhe
    5. Se ne vuole inserire più di due allora alloco 4(il risultato di prima)*2

    PS: potete dirmi come si fa il casting prima dell'allocazione?

    Grazie
  • Re: Allocazioni dinamica di un array di stringhe

    Per allocare più memoria devi utilizzare la funzione realloc.

    Per quanto riguarda il casting del risultato della malloc... non è consigliato: link.
  • Re: Allocazioni dinamica di un array di stringhe

    Grazie mille, non conoscevo la funzione realloc.

    Un' altra domanda:
    come faccio a inserire una stringa con spazi?
  • Re: Allocazioni dinamica di un array di stringhe

    Usa la funzione fgets.
  • Re: Allocazioni dinamica di un array di stringhe

    Infatti sto provando ad usarla ma non mi funziona.

    Voglio inserire 10 utenti:
    il primo lo inserisce, i restanti no.
    
    
    for(i=0; i<10; i++{
            printf("Inserisci stringa: ");
            fgets(array_stringhe[i], 255, stdin);         
        }
    
    
    Ha lo stesso funzionamento anche se metto una parola senza spazi
  • Re: Allocazioni dinamica di un array di stringhe

    Ti mancava una parentesi nel for. A me così funziona correttamente:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_LENGTH 50
    
    int main()
    {
        char **array_stringhe;
        int numero_stringhe = 10;
        int i;
    
        array_stringhe = malloc(numero_stringhe * sizeof(char *));
        for(i=0; i<numero_stringhe; i++)
        {
            array_stringhe[i] = malloc(MAX_LENGTH * sizeof(char));
        }
    
    
        for(i=0; i<10; i++)
        {
            printf("Inserisci stringa: ");
            fgets(array_stringhe[i], MAX_LENGTH, stdin);
        }
    
    
        printf("Prima stringa: %s\n", array_stringhe[0]);
        printf("Seconda stringa: %s\n", array_stringhe[1]);
    
    
        return 0;
    }
    
    Nota: la fgets memorizza nella stringa anche il carattere di "a capo", cioè '\n'. Se lo vuoi eliminare devi procedere manualmente: ti conviene scriverti una piccola funzione che faccia questa operazione e chiamarla per ogni stringa che leggi.
  • Re: Allocazioni dinamica di un array di stringhe

    Mi puoi consigliare come fare questa funzione?
  • Re: Allocazioni dinamica di un array di stringhe

    Sì, è piuttosto semplice: analizzi la stringa un carattere alla volta e quando trovi '\n' lo sostituisci con '\0' che è il terminatore di una stringa. Tutto qui.
  • Re: Allocazioni dinamica di un array di stringhe

    Ma la stringa da analizzare come la prendo? Con fgets?
  • Re: Allocazioni dinamica di un array di stringhe

    Se il \n c'è sta a fine stringa, quindi non ti serve controllare tutti i caratteri ma solo l'ultimo, che puoi ottenere tramite la strlen

    Fino ad ora si è parlato di fgets, perché domandi ancora come fare l'input? Qualcosa non è chiaro?

    Perché dici che non funziona l'input con la fgets? Perché non mostri tutto il codice che adesso hai scritto e chiarisci meglio cosa vuol dire "non funziona"?
  • Re: Allocazioni dinamica di un array di stringhe

    Il codice è il seguente
    
    
     while( cicla == 0){
            printf("Inserisci stringa: ");
            
            fgets(nuovaStringa, 255, stdin);
            
            
            if(i == dimensione){
                array_stringhe = ingrandisciECopia(array_stringhe , dimensione, (dimensione*2) );  //invocazione funzione ingrandisciECopiaVettoreStudente
                dimensione = dimensione * 2;
    	}
            
            strcpy(array_stringhe[i], nuovaStringa);
            
            printf("Vuoi inerire un altra stringa(0/1)? ");
            scanf("%d", &cicla);
            i++;
        }
    
    
    Non capisco come faccio a prendere la stringa per la funzione, con scanf o fgets?
Devi accedere o registrarti per scrivere nel forum
24 risposte