[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 595.   C: «ctype.h»

Il file ctype.h della libreria standard definisce alcune funzioni per la classificazione e la trasformazione dei caratteri (intesi come char). Gli esempi proposti riguardano esclusivamente l'insieme di caratteri corrispondente alla codifica ASCII e, di conseguenza, la configurazione locale C.

Le funzioni di questo file hanno in comune il parametro, costituito da un valore intero di tipo int, usato per rappresentare il carattere.(1) Le funzioni del tipo is...() restituiscono un valore intero diverso da zero (corrispondente a Vero) se la condizione riferita al carattere fornito si verifica. Le funzioni to...() restituiscono un valore intero, corrispondente al carattere fornito e trasformato nel modo richiesto, se ciò è possibile.

Listato 595.1. Prototipi delle funzioni dichiarate nel file ctype.h.

int isalnum  (int c);
int isalpha  (int c);
int isblank  (int c);
int iscntrl  (int c);
int isdigit  (int c);
int isgraph  (int c);
int islower  (int c);
int isprint  (int c);
int ispunct  (int c);
int isspace  (int c);
int isupper  (int c);
int isxdigit (int c);
int tolower  (int c);
int toupper  (int c);

595.1   Funzioni «is...()»

Il gruppo di funzioni is...() restituisce un valore intero diverso da zero (corrispondente a Vero) se la condizione riferita al carattere fornito si verifica. Vengono proposte le varie soluzioni, affiancando la tabella ASCII con i caratteri validi evidenziati.

Listato 595.2. Funzione isalnum().

isalnum()
#include <ctype.h>
int
isalnum (int c)
{
    if (isalpha (c) || isdigit (c))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.3. Funzione isalpha().

isalpha()
int
isalpha (int c)
{
    if (isupper (c) || islower (c))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.4. Funzione isblank().

isblank()
#include <ctype.h>
int
isblank (int c)
{
    if (c == ' ' || c == '\t' )
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.5. Funzione iscntrl().

iscntrl()
#include <ctype.h>
int
iscntrl (int c)
{
    if (  ((c >= 0x00) && (c <= 0x1F))
       || (c == 0x7F))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.6. Funzione isdigit().

isdigit()
#include <ctype.h>
int
isdigit (int c)
{
    if ((c >= 0x30) && (c <= 0x39))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.7. Funzione isgraph().

isgraph()
#include <ctype.h>
int
isgraph (int c)
{
    if ((c >= 0x21) && (c <= 0x7E))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.8. Funzione islower().

islower()
#include <ctype.h>
int
islower (int c)
{
    if ((c >= 0x61) && (c <= 0x7A))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.9. Funzione isprint().

isprint()
#include <ctype.h>
int
isprint (int c)
{
    if ((c >= 0x20) && (c <= 0x7E))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.10. Funzione ispunct().

ispunct()
#include <ctype.h>
int
ispunct (int c)
{
    if (  isgraph (c)
       && (! isspace (c))
       && (! isalnum(c)))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.11. Funzione isspace().

isspace()
#include <ctype.h>
int
isspace (int c)
{
    if (  (c == ' ')
       || (c == '\f')
       || (c == '\n')
       || (c == '\r')
       || (c == '\t')
       || (c == '\v'))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.12. Funzione isupper().

isupper()
#include <ctype.h>
int
isupper (int c)
{
    if ((c >= 0x41) && (c <= 0x5A))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

Listato 595.13. Funzione isxdigit().

isxdigit()
#include <ctype.h>
int
isxdigit (int c)
{
    if (  ((c >= 0x30) && (c <= 0x39))
       || ((c >= 0x41) && (c <= 0x46))
       || ((c >= 0x61) && (c <= 0x66)))
      {
        return 1;
      }
    else
      {
        return 0;
      }
}

595.2   Macro-istruzioni «is...()»

In alternativa a delle funzioni vere e proprie, si possono realizzare semplicemente delle macro-istruzioni per verificare le condizioni riferite al carattere. Il listato seguente è conforme a quanto già visto nella sezione precedente:

#define isblank(C)  ((int) (C == ' ' || C == '\t'))
#define isspace(C)  ((int) (C == ' ' \
                            || C == '\f' \
                            || C == '\n' \
                            || C == '\n' \
                            || C == '\r' \
                            || C == '\t' \
                            || C == '\v'))
#define isdigit(C)  ((int) (C >= '0' && C <= '9'))
#define isxdigit(C) ((int) ((C >= '0' && C <= '9') \
                             || (C >= 'A' && C <= 'F') \
                             || (C >= 'a' && C <= 'f')))
#define isupper(C)  ((int) (C >= 'A' && C <= 'Z'))
#define islower(C)  ((int) (C >= 'a' && C <= 'z'))
#define iscntrl(C)  ((int) ((C >= 0x00 && C <= 0x1F) || C == 0x7F))
#define isgraph(C)  ((int) (C >= 0x21 && C <= 0x7E))
#define isprint(C)  ((int) (C >= 0x20 && C <= 0x7E))
#define isalpha(C)  (isupper (C) || islower (C))
#define isalnum(C)  (isalpha (C) || isdigit (C))
#define ispunct(C)  (isgraph (C) && (!isspace (C)) && (!isalnum (C)))

595.3   Funzioni di conversione

Le due funzioni tolower() e toupper() si occupano di convertire un carattere, rispettivamente, in minuscolo o in maiuscolo.

Listato 595.15. Funzione tolower().

#include <ctype.h>
int
tolower (int c)
{
    if (isupper (c))
      {
        return (c + 0x20);
      }
    else
      {
        return c;
      }
}

Listato 595.16. Funzione toupper().

#include <ctype.h>
int
toupper (int c)
{
    if (islower (c))
      {
        return (c - 0x20);
      }
    else
      {
        return c;
      }
}

595.4   Macro-istruzioni di conversione

Anche le funzioni toupper() e tolower() possono essere rappresentate agevolmente in forma di macro-istruzioni. Il listato seguente è conforme a quanto già visto nella sezione precedente:

#define tolower(C)  (isupper (C) ? ((C) + 0x20) : (C))
#define toupper(C)  (islower (C) ? ((C) - 0x20) : (C))

595.5   Esempio di utilizzo delle funzioni

Viene proposto un programma molto semplice che utilizza tutte le funzioni dichiarate nel file ctype.h.

#include <stdio.h>
#include <ctype.h>

int
main (int argc, char *argv[])
{
    int c;
    for (c = 0; c <= 0x7F; c++)
      {
        printf ("%02x", c);
        printf ("\t"); if (iscntrl (c))  printf ("cntrl");
                       if (isprint (c))  printf ("print");
        printf ("\t"); if (isblank (c))  printf ("blank");
                       if (isgraph (c))  printf ("graph");
        printf ("\t"); if (isspace (c))  printf ("space");
                       if (ispunct (c))  printf ("punct");
                       if (isupper (c))  printf ("upper");
                       if (islower (c))  printf ("lower");
                       if (isdigit (c))  printf ("digit");
        printf ("\t"); if (isalnum (c))  printf ("alnum");
        printf ("\t"); if (isxdigit (c)) printf ("xdigit");
        printf ("\t"); if (isalpha (c))  printf ("alpha");
        printf ("\n");
      }
    printf ("\n");
    printf ("ASCII:\n");
    for (c = 0; c <= 0x7F; c++)
      {
        if (isprint (c)) printf ("%c", c);
      }
    printf ("\n");
    printf ("\n");
    printf ("to upper:\n");
    for (c = 0; c <= 0x7F; c++)
      {
        if (isprint (c)) printf ("%c", toupper (c));
      }
    printf ("\n");
    printf ("\n");
    printf ("to lower:\n");
    for (c = 0; c <= 0x7F; c++)
      {
        if (isprint (c)) printf ("%c", tolower (c));
      }
    printf ("\n");
    return 0;
}

Una volta compilato il programma, avviandolo si deve ottenere un testo come quello che si vede nell'estratto seguente:

...
44      print   graph   upper   alnum   xdigit  alpha
45      print   graph   upper   alnum   xdigit  alpha
46      print   graph   upper   alnum   xdigit  alpha
47      print   graph   upper   alnum           alpha
48      print   graph   upper   alnum           alpha
...
ASCII:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\
  \[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ to upper: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\
  \[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~ to lower: !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz\
  \[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

595.6   Riferimenti


1) Il carattere viene convertito da unsigned char a int.


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome c_171_ctype_h_187.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory