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 odczytem EOF (znacznik końca pliku) a znakiem o tym samym wzorze bitowym.
  • Funkcje klasyfikacji znaków (np. isspace ) oczekują, że ich argument będzie reprezentowalny jako unsigned char lub wartość makra EOF . Ponieważ właśnie to zwraca fgetc , tutaj nie ma potrzeby konwersji.
  • Zwracana wartość funkcji klasyfikacji znaków rozróżnia tylko zero (co oznacza false ) i niezerową (co oznacza true ). 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 jako unsigned char lub wartość makra EOF .
  • Wyrażenie *p jest typu char i dlatego musi zostać przekonwertowane, aby pasowało do powyższego sformułowania.
  • Typ char jest zdefiniowany jako równoważny znakowi signed char lub unsigned char .
  • Gdy char jest równoważny unsigned char , nie ma problemu, ponieważ każda możliwa wartość typu char jest reprezentowana jako unsigned char .
  • Gdy char jest równoważny znakowi signed char , musi zostać przekonwertowany na unsigned 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 oznacza true ). 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. */
C99
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)


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow