Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C] - stringhe da scanf di dimensioni variabili

    Ciao a tutti!!
    Ho un dubbio per quanto riguarda le stringhe prese tramite scanf.

    In pratica quello che vorrei fare è questo
    codice:
    char *campo;
    printf("Inserisci campo\n");
    scanf("%s", campo);
    Ovviamente, però, quando arrivo alla scanf, poichè per campo non è stata allocata memoria, il programma va in segmentation fault.
    Quello che mi e vi chiedo quindi è se è possibile prendere da scanf una stringa di dimensione variabile e allocare dinamicamente memoria in base alla lunghezza della stringa letta.
    Per esempio, se leggo una stringa di 10 caratteri, userò
    codice:
    char *campo = malloc(strlen(campo) + 1); //+1 per contenere il carattere '\0'
    Oppure devo necessariamente dichiarare un array di caratteri di dimensione finita nel sorgente??

    grazie mille a tutti

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,469
    Come fai a fare una strlen se la stringa non esiste?

    Quello che chiedi non è possibile. Devi allocare un buffer di lunghezza fissa.

    Semmai, dopo, puoi ridurre la dimensione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Potresti usare la getchar e la realloc per cambiare in continuazione le dimensioni della stringa.Io a mio tempo avevo fatto una funzione del genere:

    http://forum.html.it/forum/showthrea...readid=1435903

    Però dopo tanta pratica sono arrivato alla conclusione che la soluzione migliore è usare un buffer di dimensioni fisse:

    codice:
    void input(char** buffer)
    {
        char temp[1000];
        fgets(temp,1000,stdin);
        *buffer=(char*)malloc( (strlen(temp)+1) *sizeof(char) );
        strcpy(*buffer,temp);
    }
    Perchè anche la realloc provoca una chiamata di sistema e non è il massimo della velocità.
    Però come esercizio sarebbe bello da fare.

  4. #4
    Grazie mille ad entrambi
    In pratica, come immaginavo, non è possibile fare qualcosa del genere senza allocare un vettore di lunghezza fissa.
    E se la lunghezza invece dovesse essere maggiore di quella stabilita? Come si fa? Creo una funzione per aumentare la lunghezza del vettore?

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Originariamente inviato da tigerjack89
    Grazie mille ad entrambi
    In pratica, come immaginavo, non è possibile fare qualcosa del genere senza allocare un vettore di lunghezza fissa.
    Come ho detto si può fare con la getchar in un ciclo.

    E se la lunghezza invece dovesse essere maggiore di quella stabilita? Come si fa? Creo una funzione per aumentare la lunghezza del vettore?
    Il post di Simonassi era lungo, quardati la versione n° 6:
    http://forum.html.it/forum/showthrea...6#post13179356

  6. #6
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93
    mi sorge un dubbio .. o meglio .. una curiosita` .. e` necessario usare un buffer o e` possibile usare anche realloc ? che non sovrascrive la parte di memoria occupata ..
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    codice:
    char* input(void)
    {
        char* buffer,temp;
        int count=1;
        buffer=(char*)malloc(sizeof(char));
        while((temp=getchar())!=10)
        {
            buffer[count-1]=temp;
            count++;
            buffer=(char*)realloc(buffer,count*sizeof(char));
        }
        buffer[count-1]=0;
        return buffer;
    }

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,469
    Allocare un byte e riallocare byte dopo byte, a parte l'aspetto didattico, è assolutamente assurdo dal punto di vista dell'efficienza e delle performance.

    In un'era in cui si parla facilmente di gigabyte, allocare un buffer da 4 K (poco più di 4 mila byte) è più che sufficiente per gestire l'input.

    Penso che non ci dovremmo perdere dietro questi problemi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Se è necessario gestire input arbitrariamente lunghi nulla impedisce di usare una normale fgets, continuando a riallocare raddoppiando ad esempio ogni volta le dimensioni del buffer fino a quando non si raggiunge un newline.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93
    si oregon anche io penso che il codice postato da ramy89 sia un po` "esasperato" .. anche se credo che alcune librerie c++ facciano qualcosa di simile .. o quasi .. io intendevo usare una sola allocazione di buffer iniziale .. ad esempio 100 e dopo aver letto la stringa riallocare alla giusta dimensione .. anche in questo caso trovi sia assolutamente inefficiente ?
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

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.