Logo Background RSS

Pubblicita'

Scanset in C

  • Scritto da spriksprik Nessun Commento Comments
    Ultimo aggiornamento: 16 novembre, 2009

    imgprog

    Lo scanset è un particolare specificatore di formato che posseggono le funzioni della serie scanf.
    Uno scanset è una sorta di filtro che permette di acquisire solo i caratteri interessati e assegnarli al corrispondente vettore di caratteri.
    E’ formato da tutti i caratteri posti fra parentesi quadre precedute da un segno di percentuale, per esempio:

    scanf("%[bnmf]", dati); /* Filtra le lettere minuscole b n m f */
    scanf("%[ABCF]", dati); /* Filtra le lettere maiuscole A B C F */
    scanf("%[0123]", dati); /* Filtra i caratteri numerici 0 1 2 3 */

    La funzione scanf continuerà a leggere i caratteri specificati nello scanset finchè non si incontra un carattere diverso da essi.

    E’ possibile specificare un intervallo di caratteri tramite il trattino di unione ” – ” :

    scanf("%[a-z]", dati); /* Filtra tutte le lettere minuscole */
    scanf("%[A-Z]", dati); /* Filtra tutte le lettere maiuscole */
    scanf("%[0-9]", dati); /* Filtra tutti i caratteri numerici */

    In questo caso, la funzione scanf continuerà a leggere finchè non si incontra un carattere che non è compreso nell’intervallo specificato.

    Allo stesso modo è possibile definire più intervalli nello stesso scanset:

    scanf("%[a-z A-Z]", dati); /* Filtra lettere minuscole e maiuscole */
    scanf("%[a-z 0-9]", dati); /* Filtra lettere minuscole e caratteri numerici*/

    La condizione dello scanset si può negare utilizzando l’apposito segno ” ^ ” prima della condizione fra parentesi quadre:

    scanf("%[^abc]", dati); /* Non filtra le minuscole a b c */
    scanf("%[^A-Z]", dati); /* Non filtra tutte le lettere maiuscole*/

    In questo caso, lo scanset filtrerà tutti i caratteri finchè non verrà inserito un carattere fra quelli nella condizione dopo lo ” ^ ” .

    I caratteri immessi e non previsti dallo scanset, rimangono nello stdin (per la scanf) e saranno interpretati come dati di ingresso al momento della successiva acquisizione.
    Questo comportamento può creare dei problemi non di poco conto, e per evitarli bisogna svuotare il buffer di lettura (stdin, in questo caso), utilizzando la funzione fflush.
    Ecco un esempio completo:

    #include <stdio.h>
    void main()
    {
    char nome[50], data[20];
    printf("Inserisci nome e cognome: ");
    scanf("%[a-z A-Z]", nome); /* Filtra lettere maiuscole e minuscole */
    fflush(stdin);
    printf("Inserisci data di nascita: ");
    scanf("%[0-9 -/._ ]", data); /* Filtra caratteri numerici e punteggiatura - / . _ */
    fflush(stdin);
    printf("%s e' nato il %s", nome, data);
    }

Pubblicita'

Inserisci un commento

:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :1up: :alert: :beer: :borg: :coffee: :cuckoo: :cuss: :finger: :goombah: :megaman: :pity: :noshake: :oogle: :pacman: :pill: :poison: :poop: :rant: :satansmoking: :shake: :shiftyeyes: :shroom: :sick: :smirk: :stfu: :thumbdown: :thumbup: :turtle: :what: :whatever:
Notify me of follow-up comments via email.