Ctype.h

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 3. srpna 2022; kontroly vyžadují 18 úprav .

ctype.h  je hlavičkový soubor standardní knihovny programovacího jazyka C obsahující deklarace funkcí pro klasifikaci a převod jednotlivých znaků.

Funkce

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.

Klasifikační funkce

#include <ctype.h> int isalnum ( int c ); //Pokud je argumentem funkce písmeno nebo číslo, vrátí nenulovou hodnotu. int isalpha ( int c ); //Vrátí nenulovou hodnotu, pokud je jejím argumentem písmeno, jinak nulu. int je prázdné ( int c ); //Vrátí hodnotu true, pokud c je mezera nebo vodorovný tabulátor (C99). int iscntrl ( int c ); //Vrátí hodnotu true, pokud je c řídicí znak, například <Ctrl+B>. int isdigit ( int c ); //Vrátí nenulovou hodnotu, pokud je jejím argumentem desetinná číslice, jinak nula. int isgraph ( int c ); //Vrátí hodnotu true, pokud c je tisknutelný znak bez mezer. int islower ( int c ); //Vrátí hodnotu true, pokud je c malé písmeno. int isprint ( int c ); //Vrátí hodnotu true, pokud c je tisknutelný znak. int ispunct ( int c ); //Vrátí hodnotu true, pokud c je interpunkční znaménko (jakýkoli tisknutelný znak jiný než mezera nebo alfanumerický znak). int isspace ( int c ); //Vrátí hodnotu true, pokud je c znak mezery: mezera, nový řádek, posun stránky, návrat vozíku, svislý tabulátor, vodorovný tabulátor nebo případně jiný znak definovaný implementací int isupper ( int c ); //Vrátí hodnotu true, pokud c je velké písmeno. int isxdigit ( int c ); //Vrátí hodnotu true, pokud c je hexadecimální číslice.

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.

Transformační funkce

#include <ctype.h> int toupper ( int c ); // převede malá písmena na velká int tolower ( int c ); // převede velká písmena na malá

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]

Implementace funkcí

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 (); }


Příklady použití

//Následující kód přečte znak a převede jej na //int, pokud je zadaná číslice. #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main ( void ) { int c = fgetc ( stdin ); if ( c != EOF ) { if ( je číslice ( c ) ) printf ( "Zadali jste číslo %i \n " , atoi (( char * ) & c ) ); jiný printf ( "Není to číslo! \n " ); } návrat 0 ; }

Odkazy

Poznámky

  1. 12 ISO/IEC 9899: 1999 . Získáno 31. července 2011. Archivováno z originálu 22. srpna 2011.