Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250

    [C/C++]Domanda su fgets

    Ciao ragazzi e buona pasqua .

    Premetto che ho letto la documentazione di fgets ma non trovo ciò che fa al caso mio.

    Ovvero:
    On success, the function returns str.
    If the end-of-file is encountered while attempting to read a character, the eof indicator is set (feof). If this happens before any characters could be read, the pointer returned is a null pointer (and the contents of str remain unchanged).
    If a read error occurs, the error indicator (ferror) is set and a null pointer is also returned (but the contents pointed by str may have changed).
    Qui mi sembra parli solo dell'eventuale occorrenza della fine del file...ma come faccio a controllare che la funzione non vada in "buffer overflow" ,ovvero come faccio a controllare che il buffer sia sufficentemente capiente?
    Ad esempio:
    codice:
    int main()
    {
    char parola[5];
    
        do{
            cout << "Inserisci la parola da testare ";
            fgets(parola,5,stdin);
            if(//Non so la condizione)
              cout << "Buffer overflow ";
          }
          while(non so la condizione);
    Come condizione ho provato a metterci ferror(stdin) ma non funziona..anche perchè questo bit si setta solo se c'è stato un errore di lettura...e questo non è un errore di lettura

    Grazie delle risposte

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Forse non ti ho capito ma dato che hai letto la documentazione ti chiedo ... a cosa serve il secondo parametro ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: [C/C++]Domanda su fgets

    Originariamente inviato da Marco1995
    Ciao ragazzi e buona pasqua .

    Premetto che ho letto la documentazione di fgets ma non trovo ciò che fa al caso mio.

    Ovvero:

    Qui mi sembra parli solo dell'eventuale occorrenza della fine del file...ma come faccio a controllare che la funzione non vada in "buffer overflow" ,ovvero come faccio a controllare che il buffer sia sufficentemente capiente?
    Ad esempio:
    codice:
    int main()
    {
    char parola[5];
    
        do{
            cout << "Inserisci la parola da testare ";
            fgets(parola,5,stdin);
            if(//Non so la condizione)
              cout << "Buffer overflow ";
          }
          while(non so la condizione);
    Come condizione ho provato a metterci ferror(stdin) ma non funziona..anche perchè questo bit si setta solo se c'è stato un errore di lettura...e questo non è un errore di lettura

    Grazie delle risposte
    Il buffer overflow letteralmente non si verifica mai visto fgets si "ferma" prima (assumendo ovviamente che tu le passi il giusto secondo parametro), se intendi verificare che sia stata letta l'intera linea, visto che uno stream di testo è presumibilmente una sequenza di stringhe con un terminatore di linea alla fine puoi controllare se la stringa letta finisce col suddetto terminatore.

    Comunque c'è qualche motivo particolare per cui usi le funzioni del C in C++? C'è la libreria iostream e le std::string da usare...
    effeffe

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Forse non ti ho capito ma dato che hai letto la documentazione ti chiedo ... a cosa serve il secondo parametro ?
    Il secondo parametro serve a specificare la dimensione del buffer per non sforare.Il problema è che non so come "far accorgere" il programma che è stato "oltrepassato" lo spazio limite.

    se intendi verificare che sia stata letta l'intera linea, visto che uno stream di testo è presumibilmente una sequenza di stringhe con un terminatore di linea alla fine puoi controllare se la stringa letta finisce col suddetto terminatore.
    Se ti riferisci al '\0' ammesso che controlli se la stringa letta finisce col terminatore...non ho la certezza che la stringa sia stata letta interamente,dato che la funzione "legge quello che può leggere" e poi ci piazza il terminatore alla fine,o sbaglio?

    Comunque c'è qualche motivo particolare per cui usi le funzioni del C in C++? C'è la libreria iostream e le std::string da usare...
    No,non c'è nessun motivo particolare,ma dato che ho sempre usato le librerie e le funzioni del C, mi sono abituato con quelle(apparte cout e cin che sono troppo comode )

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Marco1995
    Il secondo parametro serve a specificare la dimensione del buffer per non sforare.
    Quindi, perché ti chiedi come evitare gli overflow?

    Il problema è che non so come "far accorgere" il programma che è stato "oltrepassato" lo spazio limite.
    Continuo a non capire. Non se ne deve occupare il tuo programma ... è la fgets che non lo oltrepassa ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250

    Continuo a non capire. Non se ne deve occupare il tuo programma ... è la fgets che non lo oltrepassa ...
    Esempio:
    codice:
    int main()
    {
        int i;
        char parola[5];
        fgets(parola,5,stdin);
        for(i=0;i<strlen(parola);i++)
           if(parola[i] != parola[strlen(parola)-i-1])
            break;
    
        if(i==strlen(parola))
          cout << "Palindroma";
        else
          cout << "Non palindroma";
    }
    Al di là del codice banale buttato giù in 2 secondi...se io metto "anna" ok,la parola è palindroma...ma se metto "annaciao" la parola è palindroma lo stesso perchè giustamente la fgets tronca le parti in eccesso.
    Io vorrei fare in modo che la fgets mi riconoscesse questo caso. (quando il buffer è minore della lunghezza della parola).
    Altro esempio:
    codice:
    void StampaContrario(char parola[],int indice);
    int main()
    {
        char parola[5];
        cout << "Inserisci la parola ";
        fgets(parola,5,stdin);
    
        StampaContrario(parola,0);
        return 0;
    }
    void StampaContrario(char parola[],int indice)
    {
        if (parola[indice+1]=='\0')
           return;
    
           StampaContrario(parola,++indice);
           cout << parola[indice];
           if(indice==1)
             cout << parola[0];
    
    }
    Se do in input annaciao...in output ottengo solamente anna;se addirittura faccio così:
    codice:
    if (parola[indice+1]=='\n')
           return;
    ottengo una lunga sequenza di caratteri casuali..

  7. #7
    Se l'ultimo carattere della stringa ottenuta non è un '\n' c'è stato un troncamento.
    codice:
    char str[256];
    fgets(str, sizeof(str), stdin);
    if(str[strlen(str)-1]!='\n')
    {
        // c'è stato troncamento
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Se l'ultimo carattere della stringa ottenuta non è un '\n' c'è stato un troncamento.
    codice:
    char str[256];
    fgets(str, sizeof(str), stdin);
    if(str[strlen(str)-1]!='\n')
    {
        // c'è stato troncamento
    }
    Proprio questo mi serviva!!Forse prima mi ero espresso male..ma hai centrato in pieno il mio problema
    Se l'ultimo carattere della stringa ottenuta non è un '\n' c'è stato un troncamento.
    Non dovremmo parlare di *penultimo* carattere della stringa?L'ultimo dovrebbe essere sempre il carattere terminatore '\0' . .

  9. #9
    Originariamente inviato da Marco1995
    Proprio questo mi serviva!!Forse prima mi ero espresso male..ma hai centrato in pieno il mio problema

    Non dovremmo parlare di *penultimo* carattere della stringa?L'ultimo dovrebbe essere sempre il carattere terminatore '\0' . .
    Questione di gusti... mi piace pensare che il \0 sia "uno dopo l'ultimo" (in altri termini, serve a terminare la stringa, ma concettualmente non è "davvero" parte della stringa - strlen, ad esempio, non lo conta).
    Vedila così: "" è una stringa di lunghezza 0, anche se in realtà è un array di char contenente solo '\0' in prima posizione.

    ... poi comunque l'importante è intendersi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    5
    è il penultimo.

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.