#include <ctype.h> // <cctype> en C++
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.
int
car la fonction peut aussi accepter la valeur -1 (EOF - End Of File) correspondant à la fin d'un
flux.
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.
#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 $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :