Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 35
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C]Inserire da input una stringa arbitrariamente lunga

    Salve ragazzi, stò cercando di creare una funzione per inserire una stringa da input arbitrariamente lunga. Io per adesso ho la seguente function:

    codice:
    char *StringaArbitraria()
    {
        int i=0;
        char *c,ci;
        c=(char*)malloc(sizeof(char));
    
        while(ci!=10) // mi fermo quando trovo un newline \n
        {
          ci=getchar(); // inserisco un singolo carattere
          c[i]=ci; // lo associo puntatore
          i++;
          c=(char*)realloc(c,sizeof(char)*(i+1));
        }
        c[i]='\0'; //inserisco terminatore '\0' 
        
        return c;
    }
    Però, il prof. ci ha detto che usare tante volte la realloc, è dispendioso e và modificata, come posso modificare questa function?
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Di solito per ottimizzare i realloc si usano dei metodi per riallocarla il minor numero di volte possibile.
    Tipo allocare sempre il doppio della memoria gia' allocata e magari partire con un array gia' allocato. Hai un piccolo spreco di memoria che però ottimizza la riallocazione.

    es. parti con un array di 20 char. se volessi inserire il 20°, allochi altri 20 caratteri, poi al 40° allochi altri 40 caratteri ecc...

    così facendo ti risparmi molti realloc pagando un piccolo spreco di memoria.
    lolide
    Java Programmer

    Informati

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Fai che metti una stringa lunga (ad esempio) 100 caratteri, la prendi in input con fgets, la copi su un' area di memoria allocata dinamicamente e la ritorni.
    Per esempio puoi fare così:

    codice:
    char* get_string(void)
    {
        char buffer[100], *result;
        fgets(buffer,100,stdin);
        result=(char*)malloc( (strlen(buffer)+1)* sizeof(char));
        return result;
    }
    Una variante consiste nel prende in input direttamente la stringa allocata dinamicamente, ma allocando tot caratteri alla volta (ad esempio 10) e riallocandola solo quando supera le dimensioni dell' input, ma di tot caratteri alla volta pe limitare le chiamate alla realloc:

    codice:
    char* get_string(void)
    {
        char* result=(char*)malloc(10*sizeof(char)),temp,length=0,dim=10;
        while( (temp=getchar())!=10)
        {
            length++;
            if(dim<length)
            {
                dim+=10;
                result=(char*)realloc(dim*sizeof(char));
            }
            result[length-1]=temp;
        }
        return result;
    }
    Poi ci sono mille varianti, e dipende sostanzialmente da:
    -Quanta memoria vuoi occupare al massimo;
    -Quanto vuoi che la routine sia veloce.

    Scegli te l' importanza di questi fattori.

    PS: Ci potrebbe essere qualche errore perché le ho scritte senza provare a compilarle.

  4. #4
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    codice:
    #include<string.h>
    #include<stdio.h>
    
    char *get_string(void);
    
    int main()
    {
        char *c;
        c=get_string();
        
        printf("La stringa inserita e': %s", c);
        
        system("\nPAUSE");
    }
    
    char *get_string(void)
    {
        char* result=(char*)malloc(10*sizeof(char)),temp,length=0,dim=10;
        while( (temp=getchar())!=10)
        {
            length++;
            if(dim<length)
            {
                dim+=10;
                result=(char*)realloc(dim*sizeof(char));
            }
            result[length-1]=temp;
        }
        
        return result;
    }
    Nella compilazione non dà alcun errore, ma prova ad inserire una stringa con più di 10 caratteri e fai la stessa cosa con una stringa con meno di 10 caratteri e guarda cosa esce fuori.
    Con i sogni possiamo conoscere il futuro...

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Ma poi non riesco a capire:

    codice:
    char lenght=0;
    scusa nn è meglio fare:
    codice:
        char temp;
        int length=0;
        int dim=10;
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Forse c'è un problema nella realloc ,manca un parametro puntatore
    result=(char*)realloc(dim*sizeof(char));

    per quanto riguarda usare i char , con un char puoi rappresentare numeri fino a 255

    un char occupa un byte , è usato molto in questo modo , nella programmazione
    microcontrollori ,dove la memoria ram è di pochi byte e quindi bene risparmiarla il piu
    possibile , se si può

    su un pc da 4 GB di ram , lo trovo inutile !
    Tecnologia

  7. #7
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    torn24, sono d'accordo con te, ma quando parliamo di complessità computazionale di un algoritmo, queste cose è meglio tenerle presenti
    Con i sogni possiamo conoscere il futuro...

  8. #8
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Ho modificato giustamente il realloc in questo modo:

    codice:
    result=(char*)realloc(result, dim*sizeof(char));
    Però quando inserisco le stringhe, mi concatena alla fine sempre alcuni caratteri esempio ù, à e altri ancora... ma non riesco a capire il perchè!
    Con i sogni possiamo conoscere il futuro...

  9. #9
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    non viene inserito il terminatore stringa nella funzione , quindi ha un comportamento
    indefinito


    codice:
    char *get_string(void)
    {
        char* result=(char*)malloc(10*sizeof(char)),temp,length=0,dim=10;
        while( (temp=getchar())!=10)
        {
            length++;
            if(dim<length)
            {
                dim+=10;
                result=(char*)realloc(result,dim*sizeof(char));
            }
            result[length-1]=temp;
        }
        result[length]='\0';//aggiunge il terminatore stringa 
        return result;
    }
    Tecnologia

  10. #10
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    torn, un'unica domanda, io con getchar(); posso inserire un unico carattere.
    Ma se inserisco in input:

    Ciao sono gaten!

    va ugualmente bene, come mai?

    P.S
    Ovviamente questa funzione andrebbe bene per qualsiasi input (intero, stringa, float , double etc), basta effettuare il cast del valore di ritorno es:

    codice:
    float x;
    
    x=(float)get_string();
    Con i sogni possiamo conoscere il futuro...

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.