Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Dubbi di teoria su fgets

    Salve a tutti!

    Sulle slide datemi dal mio prof c'è scritto:

    char* fgets(char* <s>,int <n>,FILE* <file>);
    - Legge una stringa dal file fermandosi al più dopo n-1 caratteri
    - L’eventuale ‘\n’ NON viene eliminato (diverso da gets !)
    - Restituisce il puntatore alla stringa letta o NULL in caso di fine file
    o errore

    La frase in grassetto significa che fgets immagazzina in un vettore questo: "stringa\n\0"?
    Grazie

  2. #2
    si esatto,per rimuoverlo basta:

    codice:
        char input[80];
        
        fgets(input,80,stdin);
        input[strlen(input)-1] = '\0';
    o nella forma piu compatta:

    codice:
        char input[80];
    
        fgets(input,80,stdin)[strlen(input)-1] = '\0';
    Ultima modifica di vbextreme; 08-01-2014 a 12:33

  3. #3
    Grazie
    E perdona la mia ignoranza ma così facendo passo da "stringa\n\0" a "stringa\0\0"
    Va bene? Non crea problemi?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non crea problemi ma attenzione al caso in cui la stringa è completamente utilizzata. In quel caso il carattere '\n' in più non viene memorizzato.

    Quindi il codice va modificato così

    codice:
    int ilen = strlen(input)-1;
    if(input[ilen]=='\n') input[ilen]='\0';
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Grande, è perfetto così
    Ancora grazie

  6. #6
    Attenzione/bis: se non viene acquisito alcun dato da tastiera (ad esempio se l'utente preme Ctrl-D) si può avere una stringa di lunghezza zero, per cui strlen(input)-1 sfora dall'array (in negativo). Per cui per essere davvero sicuri bisognerà fare:
    codice:
    size_t len=strlen(input);
    if(len!=0 && input[len-1]=='\n')
        input[len-1]=0;
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Chiaro, così è ancora meglio! Grazie a tutti

  8. #8
    giornata di pignoletto?
    anche perchè a questo punto è meglio riscrivere la fgets.....eheheheheheh

  9. #9
    codice:
    char* mgets(char* d,int sz,FILE* f)
    {
        char* st = d;
        for(; (*d = getc(f)) != EOF && *d != '\n' && sz-- > 0 ; d++);
        *d = '\0';
        return st;
    }

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.