Fonction iscntrl

Entête à inclure

#include <ctype.h>  // <cctype> en C++

Fonction iscntrl

int iscntrl( int character );

Le standard ASCII (American Standard Code for Information Interchange), dont dérive tous les autres systèmes de codages de caractères, définit 33 caractères de contrôles. Ces caractères ont leurs codes numériques compris en 0 et 31 plus la valeur 127. Le tableau ci-dessous rappelle ces codes ainsi que leurs significations.

Code décimal Code hexadécimal Syntaxe C Nom du caractère Information complémentaire
0 0x00 '\0' NUL Caractère nul, utile en C pour terminer une chaîne de caractère
1 0x01 SOH Début d'entête (Start Of Header)
2 0x02 STX Début du texte (Start of TeXt)
3 0x03 ETX Fin du texte (End of TeXt)
4 0x04 EOT Fin de transmission (End Of Transmission)
5 0x05 ENQ Demande de fin de ligne (ENQuery end of line)
6 0x06 ACK Accusé de réception (ACKnowledge)
7 0x07 '\a' BEL Caractère d'appel sonore (BELl)
8 0x08 '\b' BS Espacement arrière (BackSpace)
9 0x09 '\t' HT Tabulation horizontale (Horizontal Tab)
10 0x0A '\n' LF Saut de ligne (Line Feed)
11 0x0B '\v' VT Tabulation Verticale (Vertical Tab)
12 0x0C '\f' FF Saut de page (Form Feed)
13 0x0D '\r' CR Retour chariot (Carriage Return)
14 0x0E SO Fin d'extension (Shift Out)
15 0x0F SI Début d'extension (Shift In)
16 0x10 DLE Data Link Escape
17 0x11 DC1 Contrôles de périphériques (Device Control) 1 à 4
DC1 et DC3 sont souvent utilisés pour coder XON et XOFF dans les canaux de communication duplex
18 0x12 DC2
19 0x13 DC3
20 0x14 DC4
21 0x15 NAK Accusé de réception négatif (Negative Acknowledge)
22 0x16 SYN Repos synchrone (SYNchronous idle)
23 0x17 ETB Fin du bloc de transmission (End of Transmission Block)
24 0x18 CAN Annulation (CANcel)
25 0x19 EM Fin de support (End of Medium)
26 0x1A SUB Substitution (SUBstitute)
27 0x1B ESC Echappement (ESCape)
28 0x1C FS Séparateur de fichiers (File Separator)
29 0x1D GS Séparateur de groupes (Group Separator)
30 0x1E RS Séparateur d'enregistrements (Record Separator)
31 0x1F US Séparateur d'unités (Unit Separator)
127 0x7F DEL Effacement (DELete)

Note : ces caractères ont été définis à une époque où les écrans graphiques n'existaient pas encore et ou les écrans textes dominaient (VT100, ...). De nos jours, ces caractères ne sont plus tous couramment utilisés avec nos environnements modernes. Malgré cela, certains restent incontournable en C ('\0', '\n', '\r' et '\t' notamment).

La fonction iscntrl permet donc de savoir si un caractère ASCII fait partie de cet ensemble ou non.

Paramètre

Valeur de retour

La valeur de retour doit être interprétée en tant que valeur booléenne. Une valeur positive non nulle signifiera qu'il s'agit bien d'un caractère de contrôle. La valeur 0 indiquera qu'il ne s'agit pas d'un caractère de contrôle.

Exemple de code

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

size_t strcpyWithoutControlCharacters( char * dest, const char * source ) {

    size_t counter = 0;
    char currentCharacter;
    do {
        currentCharacter = *source++;
        if ( ! iscntrl( currentCharacter ) ) {
            *dest++ = currentCharacter;
            counter ++;
        }
    } while ( currentCharacter != '\0' );

    *dest = '\0';

    return counter;
}

int main() {

    const char * original = "Hello\tWorld\nBye\r";
    char buffer[ 20 ];

    size_t length = strcpyWithoutControlCharacters( buffer, original );

    printf( "strlen(\"%s\") == %zu\n", buffer, length );

    return EXIT_SUCCESS;
}

Voici un petit exemple d'exécution de ce programme :

$> gcc -o Sample -Wall Sample.c
$> ./Sample
strlen("HelloWorldBye") == 13
$>

Sujets connexes

isalnum
isalpha
isblank
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit