ctype.h er header-filen i standardbiblioteket for programmeringssproget C , der indeholder erklæringer om funktioner til klassificering og konvertering af individuelle tegn.
Alle følgende funktioner har prototyper af følgende form:
int имя_функции( int );
intAlle disse funktioner tager -ækvivalenten af et tegn som et argument og returnerer en værdi af typen int, som kan repræsentere enten et andet tegn (i tilfælde af konverteringsfunktioner) eller en boolsk værdi: 0 betyder "False" og en ikke-nul værdi betyder "Sand" (dette gælder for klassifikationsfunktioner).
Disse funktioners adfærd afhænger af den aktuelle kodning . [en]
Resultatet af at anvende disse funktioner på tegn med koder, der tilhører tegnsættet med udvidet eksekveringstid , afhænger af platformen og lokaliseringen.
Disse funktioner kontrollerer, om argumentet er et bogstav eller ciffer, mellemrum eller tabulator, kontroltegn, decimaltegn, printbart tegn (undtagen mellemrum), små bogstaver, printbart tegn (inklusive mellemrum), mellemrum, stort tegn eller hexadecimalt tal.
Funktionerne konverterer tegnet c til små eller store bogstaver, hvis det er muligt. Ellers returnerer de den uændrede værdi. [en]
I de fleste C-biblioteker bruger klassifikationsrutiner statiske opslagstabeller i stedet for makroer eller funktioner. For eksempel oprettes en matrix med 256 otte-bit heltal, hvor hver bit står for en bestemt egenskab af et tegn (er det et tal, et bogstav osv.). Hvis bit 1 angiver, om tegnet er et ciffer eller ej, kan koden skrives således:
#define isdigit(x) (TABEL[x] & 1)Tidlige versioner af Linux brugte potentielt farlig kode som følgende:
#define isdigit(x) ((x) >= '0' && (x) <= '9')Dette kan give problemer, hvis for eksempel et funktionskald blev brugt som argument. I dette tilfælde var det ikke umiddelbart klart, at funktionen blev kaldt to gange.
Misbruge
I alle tilfælde er argumentet af typen int, og dets værdi skal være i intervallet type unsigned char, eller være lig med værdien af EOF-makrokonstanten. Hvis argumentet har en anden værdi, er funktionernes opførsel udefineret.Typen charkan enten være signeret eller usigneret, afhængigt af implementeringen. Hvis typen charer signeret, kan en implicit konvertering til intresultere i negative tal, hvilket vil få funktionen til at opføre sig udefineret. Oftest er opslagstabellen uden for grænserne , og programmet går ned.
//Denne kode fungerer muligvis ikke korrekt. char test = 'b' ; top ( 'a' ); int res = ispunct ( test );For at undgå dette, når du bruger char-argumenter, skal du først eksplicit konvertere dem til int.
int-værdier returneret af funktioner getchar, getc, fgetchører nødvendigvis til rækken af værdier af typen unsigned char(eller er lig med EOF), så ingen konvertering er påkrævet her.
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <locale.h> #include <ctype.h> #include <string.h> int main () { setlocale ( LC_ALL , "RUS" ); tegn [ 100 ] ; int i , ind , n ; // Indledende data char ch [ 4 ]; printf ( "Indtast A, B og C, ingen mellemrum:" ); får_s ( ch ); printf ( "Indtast tekst: \n " ); får_s ( s ); //gets(funktion, en del af C Standard Library, erklæret i header-filen stdio.h , som læser en linje med standardinput og placerer den i bufferen oprettet af den kaldende funktion). n = strlen ( s ); //strlen(ser begyndelsen af strengen og begynder at tælle antallet af tegn først (bytes tildelt for hver if ( islower ( ch [ 1 ]) || islower ( ch [ 2 ])) //tager et tegn (bogstav) som et argument og returnerer en heltalværdi, der ikke er nul, hvis bogstavet er lille, og nul, hvis bogstavet er stort ch [ 1 ] = ch [ 1 ] - 32 ; ch [ 2 ] = ch [ 2 ] -32 ; _ for ( i = 0 ; i < n ; i ++ ) { hvis ( s [ i ] == lm [ 0 ]) { ind = i ; if ( isdigit ( s [ i - 1 ])) //isdigit (Isdigit-funktionen kontrollerer, om argumentet, der føres gennem karakterparameteren, er et decimaltal. { bryde ; } andet { s [ i ] = lm [ 1 ]; } } } for ( i = n + 1 ; i > ind ; i -- ) { s [ i ] = s [ i - 1 ]; } s [ ind + 1 ] = lm [ 2 ]; sætter ( s ); getch (); }