Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475

    [C] Ciclo eseguito una volta di troppo

    Ciao a tutti, devo realizzare un programma che conti il numero di caratteri, parole e linee in un file di testo.

    Facile, no?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
        FILE* fp = NULL;
    
        int characters = 0;
        int words = 0;
        int lines = 0;
    
        char buf = 0;
    
        fp = fopen(argv[1], "rb");
    
        while (!feof(fp))
        {
            fscanf(fp, "%c", &buf);
    
            characters++;
    
            if (buf == ' ') words++;
    
            if (buf == '\n')
            {
                words++;
                lines++;
            }
        }
    
        printf("%d %d %d\n", characters, words, lines);
    
        return 0;
    }
    L'ho testato su questo file:

    codice:
    Nel mezzo del cammin di nostra vita
    Mi ritrovai per una selva oscura,
    che la diritta via era smarrita.
    E i risultati che mi stampa sono tutti incrementati di 1! Nel file ci sono 103 caratteri (spazi e punteggiatura inclusi), 19 parole, 3 linee.

    Il programma stampa 104, 20, 4.

    Ho anche provato a seguire manualmente l'esecuzione con il debugger, carattere per carattere. Arrivato a 103 caratteri, il ciclo si ferma, esce, parte la printf... che stampa 104. -.-

    Perchè!?
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    20-05-2010 02:37
    Lo so, sono un nerd... non infierite ._.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #3
    Cerca di utilizzare sempre i valori di ritorno. Guarda qui: fscanf

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
        FILE* fp = NULL;
    
        int characters = 0;
        int words = 0;
        int lines = 0;
    	int retv;
        char buf = 0;
    
        fp = fopen(argv[1], "rb");
    
    	
        while (!feof(fp) && (retv = fscanf(fp, "%c", &buf)) != EOF)
        {	
            characters++;
    				
            if (buf == ' ') words++;
    
            if (buf == '\n')
            {
                words++;
                lines++;
            }
        }
    
        printf("%d %d %d\n", characters, words, lines);
    
        return 0;
    }
    Edit: Puoi anche prima leggere e poi testare la fine del file

    codice:
    while ((retv = fscanf(fp, "%c", &buf)) && !feof(fp))
    // oppure
    //while ((retv = fscanf(fp, "%c", &buf)), !feof(fp))
    {
    ...
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Risolto, grazie mille!
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

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.