C Language                
             - klasyfikacja i konwersja postaci
         
        
            
    Szukaj…
Klasyfikujące znaki odczytywane ze strumienia
#include <ctype.h>
#include <stdio.h>
typedef struct {
  size_t space;
  size_t alnum;
  size_t punct;
} chartypes;
chartypes classify(FILE *f) {
  chartypes types = { 0, 0, 0 };
  int ch;
  while ((ch = fgetc(f)) != EOF) {
    types.space += !!isspace(ch);
    types.alnum += !!isalnum(ch);
    types.punct += !!ispunct(ch);
  }
  return types;
}
 Funkcja classify odczytuje znaki ze strumienia i liczy liczbę spacji, znaków alfanumerycznych i interpunkcyjnych. Pozwala uniknąć kilku pułapek. 
-  Podczas odczytywania znaku ze strumienia wynik jest zapisywany jako liczba int, ponieważ w przeciwnym razie istniałaby niejednoznaczność między odczytemEOF(znacznik końca pliku) a znakiem o tym samym wzorze bitowym.
-  Funkcje klasyfikacji znaków (np. isspace) oczekują, że ich argument będzie reprezentowalny jakounsigned charlub wartość makraEOF. Ponieważ właśnie to zwracafgetc, tutaj nie ma potrzeby konwersji.
-  Zwracana wartość funkcji klasyfikacji znaków rozróżnia tylko zero (co oznacza false) i niezerową (co oznaczatrue). Aby policzyć liczbę wystąpień, wartość tę należy przekonwertować na 1 lub 0, co odbywa się przez podwójne zanegowanie!!.
Klasyfikowanie znaków z ciągu
#include <ctype.h>
#include <stddef.h>
typedef struct {
  size_t space;
  size_t alnum;
  size_t punct;
} chartypes;
chartypes classify(const char *s) {
  chartypes types = { 0, 0, 0 };
  const char *p;
  for (p= s; p != '\0'; p++) {
    types.space += !!isspace((unsigned char)*p);
    types.alnum += !!isalnum((unsigned char)*p);
    types.punct += !!ispunct((unsigned char)*p);
  }
  return types;
}
 Funkcja classify bada wszystkie znaki z ciągu i liczy liczbę spacji, znaków alfanumerycznych i interpunkcyjnych. Pozwala uniknąć kilku pułapek. 
-  Funkcje klasyfikacji znaków (np. isspace) oczekują, że ich argument będzie reprezentowalny jakounsigned charlub wartość makraEOF.
-  Wyrażenie *pjest typuchari dlatego musi zostać przekonwertowane, aby pasowało do powyższego sformułowania.
-  Typ charjest zdefiniowany jako równoważny znakowisigned charlubunsigned char.
-  Gdy charjest równoważnyunsigned char, nie ma problemu, ponieważ każda możliwa wartość typucharjest reprezentowana jakounsigned char.
-  Gdy charjest równoważny znakowisigned char, musi zostać przekonwertowany naunsigned charzanim zostanie przekazany do funkcji klasyfikacji znaków. I choć wartość znaku może się zmienić z powodu tej konwersji, dokładnie tego oczekują te funkcje.
-  Zwracana wartość funkcji klasyfikacji znaków rozróżnia tylko zero (co oznacza false) i niezerową (co oznaczatrue). Aby policzyć liczbę wystąpień, wartość tę należy przekonwertować na 1 lub 0, co odbywa się przez podwójne zanegowanie!!.
Wprowadzenie
 Nagłówek ctype.h jest częścią standardowej biblioteki C. Zapewnia funkcje do klasyfikacji i konwersji znaków. 
 Wszystkie te funkcje przyjmują jeden parametr, int który musi być albo EOF, albo reprezentowalny jako znak bez znaku. 
Nazwy funkcji klasyfikujących są poprzedzone „is”. Każda zwraca wartość całkowitą niezerową (PRAWDA), jeśli przekazany do niej znak spełnia odpowiedni warunek. Jeśli warunek nie jest spełniony, funkcja zwraca wartość zerową (FAŁSZ).
Te funkcje klasyfikujące działają jak pokazano, zakładając domyślne ustawienia regionalne C:
int a;
int c = 'A';
a = isalpha(c); /* Checks if c is alphabetic (A-Z, a-z), returns non-zero here. */
a = isalnum(c); /* Checks if c  is alphanumeric (A-Z, a-z, 0-9), returns non-zero here. */
a = iscntrl(c); /* Checks is c is a control character (0x00-0x1F, 0x7F), returns zero here. */
a = isdigit(c); /* Checks if c is a digit (0-9), returns zero here. */
a = isgraph(c); /* Checks if c has a graphical representation (any printing character except space), returns non-zero here. */
a = islower(c); /* Checks if c is a lower-case letter (a-z), returns zero here. */
a = isprint(c); /* Checks if c is any printable character (including space), returns non-zero here. */
a = isupper(c); /* Checks if c is a upper-case letter (a-z), returns zero here. */
a = ispunct(c); /* Checks if c is a punctuation character, returns zero here. */
a = isspace(c); /* Checks if c is a white-space character, returns zero here. */
a = isupper(c); /* Checks if c is an upper-case letter (A-Z), returns non-zero here. */
a = isxdigit(c); /* Checks if c is a hexadecimal digit (A-F, a-f, 0-9), returns non-zero here. */
a = isblank(c); /* Checks if c is a blank character (space or tab), returns non-zero here. */
Istnieją dwie funkcje konwersji. Są one nazywane za pomocą przedrostka „do”. Funkcje te przyjmują ten sam argument, co powyżej. Jednak zwracana wartość nie jest zwykłym zerem lub niezerową, ale przekazany argument zmienił się w pewien sposób.
Te funkcje konwersji działają jak pokazano, zakładając domyślne ustawienia regionalne C:
int a;
int c = 'A';
/* Converts c to a lower-case letter (a-z). 
 * If conversion is not possible the unchanged value is returned. 
 * Returns 'a' here. 
 */
a = tolower(c);
/* Converts c to an upper-case letter (A-Z). 
 * If conversion is not possible the unchanged value is returned. 
 * Returns 'A' here. 
 */
a = toupper(c);
Poniższe informacje są cytowane z mapy cplusplus.com, w której oryginalny 127-znakowy zestaw ASCII jest uwzględniany przez każdą z funkcji typu klasyfikującego (• oznacza, że funkcja zwraca wartość niezerową dla tego znaku)
| Wartości ASCII | postacie | iscntrl | jest pusty | isspace | isupper | islower | isalpha | isdigit | isxdigit | isalnum | ispunct | isgraph | odcisk | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x00 .. 0x08 | NUL, (inne kody kontrolne) | • | |||||||||||
| 0x09 | tab („\ t”) | • | • | • | |||||||||
| 0x0A .. 0x0D | (kody sterujące białych znaków: „\ f”, „\ v”, „\ n”, „\ r”) | • | • | ||||||||||
| 0x0E .. 0x1F | (inne kody kontrolne) | • | |||||||||||
| 0x20 | przestrzeń (' ') | • | • | • | |||||||||
| 0x21 .. 0x2F | ! "# $% & '() * +, -. / | • | • | • | |||||||||
| 0x30 .. 0x39 | 0123456789 | • | • | • | • | • | |||||||
| 0x3a .. 0x40 | :; <=>? @ | • | • | • | |||||||||
| 0x41 .. 0x46 | ALFABET | • | • | • | • | • | • | ||||||
| 0x47 .. 0x5A | GHIJKLMNOPQRSTUVWXYZ | • | • | • | • | • | |||||||
| 0x5B .. 0x60 | [] ^ _ ` | • | • | • | |||||||||
| 0x61 .. 0x66 | Alfabet | • | • | • | • | • | • | ||||||
| 0x67 .. 0x7A | ghijklmnopqrstuvwxyz | • | • | • | • | • | |||||||
| 0x7B .. 0x7E | {} ~ bar | • | • | • | |||||||||
| 0x7F | (DEL) | • |