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

    [C] Parsing di una linea con sscanf()

    Salve a tutti, io ho un file di linee fatte in questo modo:

    Un numero intero che rappresenta la matricola dello studente.
    Una stringa che ne rappresenta il cognome.
    Un numero che mi dice quanti esami ha sostenuto. (n)
    I voti degli esami che ha sostenuto.

    Il file purtroppo non l'ho fatto io, è fatto così e non posso modificarlo.

    Io devo leggere il file linea per linea e ricostruire i dati dello studente. Per i primi te non c'è alcun problema: io ricevo una stringa e li leggo così:

    codice:
    sscanf(buf, "%d%s%d", &s->matricola, &s->nome, &s->n_esami);
    (s è un puntatore alla struttura Studente che sto usando).

    Però, una volta letto il numero di esami sostenuti, alloco l'array per salvare i voti, e come faccio poi per leggerli? So che ci deve essere un metodo semplice ma non ci riesco... aiutino?
    "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 L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non ho capito ... cosa non sai fare? Come è fatto il file?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Il file è solo una ripetizione di linee fatte tutte nello stesso modo:

    n_matricola, Cognome, n_esami, [voti]

    Quello che non riuscivo a fare era, una volta ottenuta questa stringa, a leggere l'array di voti (in quanto non potevo saperne a prescindere la dimensione).

    Sono riuscito a risolvere usando strtok() per leggere la stringa parola per parola interpretandole.

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

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dopo aver allocato dinamicamente il vettore di voti, usi un ciclo for in cui usi la scanf ..
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Non la scanf, ma sscanf. I dati arrivano dalla stringa che ho letto dal file, non dallo stdin.

    Il problema per cui non riuscivo ad usare sscanf, era che:
    1) prima dei dati dell'array ne avevo altri, e non sapevo come iniziare la lettura dal punto corretto della stringa
    2) sscanf in ogni caso non funziona nei cicli, dato che ogni volta ricomincia a leggere dall'inizio della stringa:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int v[10];
        char str[] = "10 11 12 13 14 15 16 17 18 19";
        int i = 0;
    
        for (i = 0; i < 10; i++)
            sscanf(str, "%d", &v[i]);
    
        for (i = 0; i < 10; i++)
            printf("%d, ", v[i]);
    
        return 0;
    }
    L'output di questo programma è

    codice:
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    e non

    codice:
    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
    come vorrei io. Per questo ho dovuto usare strtok.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Ippo343
    sscanf in ogni caso non funziona nei cicli
    Non è detto ...

    codice:
        char *p=str;
        for (i = 0; i < 10; i++)
        {
            sscanf(p++, "%d", &v[i]);
            while(*p && (*p)!=' ') p++;
        }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Mmm... hadn't considered that... Domani ci provo. Grazie oregon
    "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 © 2025 vBulletin Solutions, Inc. All rights reserved.