ctype.h je hlavičkový soubor standardní knihovny programovacího jazyka C obsahující deklarace funkcí pro klasifikaci a převod jednotlivých znaků.
Všechny následující funkce mají prototypy následující formy:
int имя_функции( int );
Všechny tyto funkce berou jako argument int-ekvivalent znaku a vracejí hodnotu typu int, která může představovat buď jiný znak (v případě konverzních funkcí) nebo booleovskou hodnotu: 0 znamená "False" a nenulová hodnota hodnota znamená "True" (to platí pro klasifikační funkce).
Chování těchto funkcí závisí na aktuálním kódování . [jeden]
Výsledek použití těchto funkcí na znaky s kódy patřícími do znakové sady s prodlouženou dobou provádění závisí na platformě a lokalizaci.
Tyto funkce kontrolují, zda je argumentem písmeno nebo číslice, mezera nebo tabulátor, řídicí znak, desetinné číslo, tisknutelný znak (kromě mezery), malý znak, tisknutelný znak (včetně mezery), mezera, velké písmeno nebo šestnáctkové číslo.
Funkce převádějí znak c na malá nebo velká písmena, pokud je to možné. V opačném případě vrátí nezměněnou hodnotu. [jeden]
Ve většině knihoven C používají klasifikační rutiny místo maker nebo funkcí statické vyhledávací tabulky . Vytvoří se například pole 256 osmibitových celých čísel, kde každý bit představuje určitou vlastnost znaku (je to číslo, písmeno atd.). Pokud bit 1 udává, zda je znakem číslice nebo ne, pak lze kód zapsat takto:
#define isdigit(x) (TABLE[x] & 1)Dřívější verze Linuxu používaly potenciálně nebezpečný kód, jako je následující:
#define isdigit(x) ((x) >= '0' && (x) <= '9')To by mohlo způsobit problémy, pokud by bylo například jako argument použito volání funkce. V tomto případě nebylo hned jasné, že funkce byla volána dvakrát.
Zneužít
Ve všech případech je argument typu inta jeho hodnota musí být v rozsahu type unsigned charnebo se rovnat hodnotě konstanty makra EOF. Pokud má argument jakoukoli jinou hodnotu, chování funkcí není definováno.Typ charmůže být buď podepsaný nebo nepodepsaný, v závislosti na implementaci. Pokud je typ charpodepsán, pak implicitní převod na intmůže mít za následek záporná čísla, což způsobí, že se funkce bude chovat nedefinovaně. Nejčastěji je vyhledávací tabulka mimo hranice a program se zhroutí.
//Tento kód nemusí fungovat správně. char test = 'b' ; toupper ( 'a' ); int res = ispunct ( test );Abyste tomu zabránili, při použití char-arguments je nejprve explicitně převeďte na int.
int-hodnoty vrácené funkcemi getchar, getc, fgetcnutně patří do rozsahu hodnot typu unsigned char(nebo se rovnají EOF), takže zde není vyžadována žádná konverze.
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <locale.h> #include <ctype.h> #include <řetězec.h> int main () { setlocale ( LC_ALL , "RUS" ); znaky [ 100 ] ; int i , ind , n ; // Počáteční data char ch [ 4 ]; printf ( "Zadejte A, B a C, bez mezer:" ); dostane_s ( ch ); printf ( "Zadejte text: \n " ); dostane_s ( s ); //gets(funkce, součást standardní knihovny jazyka C, deklarovaná v hlavičkovém souboru stdio.h , která přečte řádek standardního vstupu a umístí jej do vyrovnávací paměti vytvořené volající funkcí). n = strlen ( s ); //strlen(uvidí začátek řetězce a začne počítat počet znaků jako první (bajty přidělené každému if ( islower ( ch [ 1 ]) || islower ( ch [ 2 ])) //zabere jeden znak (písmeno) jako argument a vrátí nenulovou celočíselnou hodnotu, pokud je písmeno malé, a nulu, pokud je písmeno velké ch [ 1 ] = ch [ 1 ] -32 ; _ ch [ 2 ] = ch [ 2 ] -32 ; _ pro ( i = 0 ; i < n ; i ++ ) { if ( s [ i ] == ch [ 0 ]) { ind = i ; if ( isdigit ( s [ i - 1 ])) //isdigit (Funkce isdigit kontroluje, zda argument předaný parametrem znaku je desítková číslice. { zlomit ; } jiný { s [ i ] = ch [ 1 ]; } } } pro ( i = n + 1 ; i > ind ; i -- ) { s [ i ] = s [ i - 1 ]; } s [ ind + 1 ] = ch [ 2 ]; klade ( s ); getch (); }