Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80

    [C] lettura stringa in input e allocazione dinamica memoria

    Ciao ragazzi,
    sto scrivendo un programmino che riceve da stdin una frase, su cui poi dovrò fare alcune operazioni.
    Non conoscendo la lunghezza della stessa, ho proceduto nel seguente modo:

    codice:
     
    
    int main(int argc, char *argv[])
    {
       
        
        if(argc > 1)
        {
            fprintf(stderr, "Usage: %s [<file] [>file]", argv[0]);
            return(EXIT_FAILURE);
        }
    
        char *p;
        p=(char*)malloc(sizeof(char));
        if(p==NULL)
        {
          fprintf(stderr, "Memory allocation error.\n");
          return(EXIT_FAILURE);
         }
    
    
        fprintf(stdout,"Inserire una stringa, quindi digitare ctrl+D:\n");
    
        int i=0;
        while(feof(stdin) == 0)
        {
            p[i]=getchar();
    
            //riallocazione memoria a ogni carattere inserito
            if(p=(char*)realloc(p, sizeof(char)*(i+1))==NULL)
            {
              fprintf(stderr, "Memory reallocation error.\n");
              return(EXIT_FAILURE);
             }
    
            i++;
        }
    
       //stampa di prova
        int j=0;
        for(j=0; j<i-1; j++)
        {
            printf("%c",p[j]);
        }
    
        return EXIT_SUCCESS;
    }
    funziona..ma secondo voi è abbastanza 'elegante' così? (sia per quanto riguarda la lettura della stringa che la riallocazione carattere per carattere?)
    Avrei preferito al posto di quel feof un qualche controllo che uscisse dal ciclo nel momento in cui l'utente avesse premuto invio,ma non sono riuscita a trovare una soluzione efficace...

    grazie

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590

    Re: [C] lettura stringa in input e allocazione dinamica memoria

    • Non de-allochi mai la memoria
    • per terminari all'invio ['\n'] basta imporre che (getchar()!='\n') come condizione del while e riorganizzare il codice di conseguenza
    • Non è una soluzione efficace in quanto le chiamate a sistema di allocazione della memoria possono richiedere molto tempo, soluzioni più efficaci possono essere utilizzare una stringa preallocata di dimensioni abbastanza grandi o re-allocare la memoria geometricamente (seguendo le potenze di 2), magari partendo già da una stringa di una certa dimensione...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80
    per il fatto della deallocazione hai ragione, me ne ero dimenticata

    per il resto, ti ringrazio

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Di niente
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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 © 2024 vBulletin Solutions, Inc. All rights reserved.