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

    [C] funzione per leggere parole da un file.. è fatta bene?

    ciao raga...

    come primissima parte di un progettino in C dovevo fare una funzione che preso il puntatore ad un file ed il puntatore ad una stringa memorizzi in ques'ultimo spazio di memoria la prima parola trovata nel file che non sia costituita da soli numeri (quindi lettere e numeri va bene) minuscolizzata, e restituisca la dimensione della parola trovata o zero se il file è finito....tutto usando solo le funzioni che uso io.. niente librerie strane..

    va bene questa mia implementazione?
    è migliorabile?
    può avere problemi?

    tnx

    int getWord(FILE *fp, char *word)
    {
    #define IS_LETTER ((current >= 'a' && current <= 'z') || (current >= 'A' && current <= 'Z'))
    #define IS_NUMBER (current >= 0 && current <=9)
    char current;
    int i,j,valida = 0;

    while(!valida) //se la parola noon è stata trovata o non è valida cerca una nuova parola
    {
    //controlla la fine del file restituendo eventualmente 0
    //ed elimina implicitamente i caratteri non validi portando avanti il puntatore
    if((current = getc(fp)) == EOF) return 0;

    i=0; //contatore dei caratteri della parola resettato ogni volta che si cerca una nuova parola

    while(IS_LETTER || IS_NUMBER)
    //quando incontra per la prima volta un carattere valido entra nel ciclo e "costruisce" la parola
    //se il carattere o la parola trovata non sono validi si torna alla lettura fuori dal ciclo
    {
    if(valida == 0 && IS_LETTER) valida = 1; //segnala che la parola non è di soli numeri
    word[i++] = current;
    current = getc(fp);
    }
    }

    for(j=0;j<i;j++) word[j] = tolower(word[j]); //minuscolizza la parola trovata

    word[i] = '\0'; //appende il carattere di terminazione delle stringhe alla parola trovata

    return i; //restituisce la lunghezza della parola trovata
    }

  2. #2
    nessuno che abbbia voglio eh?

  3. #3
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Ma se la prima parola è "1a2b3" cosa deve restituire?
    I separatori delle perole sono lo spazio e \n ?

    Poi magari cerco di migliorarlo... quando trovo un po' di tempo

  4. #4
    Originariamente inviato da iguana13
    Ma se la prima parola è "1a2b3" cosa deve restituire?
    la lunghezza della parola dopo averla memorizzata... mi pare che lo faccia no?

    I separatori delle perole sono lo spazio e \n ?
    è parte di un progetto d'esame... è chiaro che non ci sono convenzioni su quello che può arrivare in input... le uniche convenzione che ci hanno dato sono su cosa dobbiamo considerare e cosa no.. quindi immagino che il prof farà i test [fa test automatici] con svariati tipi di file di input... esmepiuo:
    file vuoto
    file con solo caratteri non validi [qualsiasi cosa non sia una lettera o un numero]
    parole inizianti per numero ma contenenti lettere
    parole inizianti per numero e non contenenti lettere
    parole inframezzate da + spazi o caratteri non validi...

    etc etc

    io non posso saperlo a priori.. posso provare a supporre e fare test..

    capito?
    anzi se ti vengono in mente test d afare...
    Poi magari cerco di migliorarlo... quando trovo un po' di tempo [/B]
    certo.. se trovi da migliorare a livello di funzionamento mi aiuti a prendere un voto + alto
    a livello di stile... non me ne frega + di tanto per il progetto in se, ma fa sempre bene imparare

    grazie


  5. #5
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Hai il testo originale?

    Perchè mi pare strano che da "1a2b3" restituisca solo "a"...

  6. #6
    Originariamente inviato da iguana13
    Hai il testo originale?

    Perchè mi pare strano che da "1a2b3" restituisca solo "a"...
    no, deve restituirla tutta.... e lo fa..

    è la prima funzioncina per un motore di ricerca su file system il testo originario dice solo che si considera parola qualsiasi sequenza alfanumerica, ma non una sequenza esclusivamente numerica
    devo solo chiedergli per le lettere accentate.. ma non ci vorrebbe nulla a considerarle

  7. #7
    perdono.. la versione che ho incollato non lo fa...

    c'è una condizione errata nel while + interno...


    if(valida == 0 && IS_LETTER)

    diventa

    if((valida == 0) && IS_LETTER)

    a quel punto funge anche con parole miste lettere e numeri...

    stamattina avevo provato da un altro pc... e andava.... ma siccome l'avevo riscritta da zero sul portatile.. e avevo postato dal portatile.....

    mi sono acorto poco fa facendo prove.. e m'era preso un colppo

    grazie

  8. #8
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Un'altra cosa che mi pare molto strana:
    codice:
    	#define IS_NUMBER (current >= 0 && current <= 9)
    Secondo me il modo corretto sarebbe:

    codice:
    	#define IS_NUMBER (current >= '0' && current <= '9')
    Perchè nel primo modo si intendono i caratteri ASCII da 0 a 9, che non corrispondono ai simboli "0" e "9" :master:

    La cosa strana è che funziona lo stesso... :master: :master:

    Altra osservazione: se non esiste nessuna parola, almeno imposta il primo carattere come '\0' !

  9. #9
    ot

    ciao igua :gren:
    tt bene? non ti vedo + su msn

    ciao

    /ot
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  10. #10
    scusate l'ot

    risp in pvt

    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.