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 char
lub 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 char
lub wartość makraEOF
. - Wyrażenie
*p
jest typuchar
i dlatego musi zostać przekonwertowane, aby pasowało do powyższego sformułowania. - Typ
char
jest zdefiniowany jako równoważny znakowisigned char
lubunsigned char
. - Gdy
char
jest równoważnyunsigned char
, nie ma problemu, ponieważ każda możliwa wartość typuchar
jest reprezentowana jakounsigned char
. - Gdy
char
jest równoważny znakowisigned char
, musi zostać przekonwertowany naunsigned char
zanim 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) | • |