Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30

    [C] miglior modo per memorizzare una stringa?

    Salve ragazzi, sono ancora scarso in programmazione, mi chiedevo, come memorizzare una stringa nel migliore dei modi?

    se utilizzo scanf allora rischio di sforare l'array e non ci mette il carattere terminatore, se uso un ciclo con il getche() allora ci son problemi con il cancellare un carattere e andare indietro e altri problemi in generale.

    come fate voi?

    grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [C] miglior modo per memorizzare una stringa?

    Originariamente inviato da Vyse220
    se utilizzo scanf allora rischio di sforare l'array e non ci mette il carattere terminatore
    scanf il terminatore lo mette...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Se non sai come allocare memoria per una stringa in modo dinamico allora ti conviene usare gets.
    Però devi dichiarare l' array di caratteri con una dimensione predefinita.
    Altrimenti io dichiaro un puntatore e utilizzo questa funzione:
    codice:
    char* get_string(FILE *fp)
    {
        char *ptr;
        ptr=(char*)malloc(sizeof(char));
        if(ptr==NULL)
        {
            perror("Errore di lettura/inserimento dei dati\n");
            return ptr;
        }
        int i=1,ci;
        if(fp==stdin)
          fflush(fp);
        else
        {
            ci=fgetc(fp);
            if(ci!='\n')
              fseek(fp,-1,SEEK_CUR);
        }
        ptr[0]='\0';
        while(ci!=10&&ci!=EOF)
        {
            ptr=(char*)realloc(ptr,i*sizeof(char));
            if(ptr==NULL)
            {
                perror("Errore di lettura/inserimento dei dati\n");
                return ptr;
            }
            ci=fgetc(fp);
            if(ci!=10)
              ptr[i-1]=ci;
            else
              ptr[i-1]='\0';
            i++;
        }
        return ptr;
    Che tra l' altro uso anche per leggere da file.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30

    Re: Re: [C] miglior modo per memorizzare una stringa?

    Originariamente inviato da Alex'87
    scanf il terminatore lo mette...
    Si ma se sfora l'array e va in overflow allora viene facilmente sovrascritto e la stringa perde il suo significato.

    Stessa cosa mi pare faccia il gets, qual'è la differenza?

  5. #5
    Originariamente inviato da ramy89
    Se non sai come allocare memoria per una stringa in modo dinamico allora ti conviene usare gets.
    gets va evitata assolutamente in quanto non consente di evitare i buffer overflow. Si usa piuttosto fgets.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30
    Originariamente inviato da MItaly
    gets va evitata assolutamente in quanto non consente di evitare i buffer overflow. Si usa piuttosto fgets.
    la stavo leggendo proprio adesso infatti, mi pare di capire che la funzione termina da sola aggiungendo il terminatore non appena raggiunto il numero di caratteri richiesto?
    Non dovrei avere casi di ambiguità o altri problemi

    è proprio quello che mi serviva
    grazie a tutti

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    30
    scusate il doppio post, ma a quanto pare l'fget mi inserisce un \n a fine stringa, come posso rimediare?

  8. #8
    Non lo inserisce, semplicemente non lo toglie (l'utente effettivamente quando inserisce il testo inserisce un newline).
    Comunque:
    codice:
    stringa[strlen(stringa)-1]=0;
    Amaro C++, il gusto pieno dell'undefined behavior.

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.