2009-04-16 9 views
6

Quelqu'un peut-il expliquer l'utilisation de la constante de caractère \ 000 et \ xhh, c'est-à-dire des nombres octaux et des nombres hexadécimaux dans une constante de caractère?Constante de caractères: 000 xhh

Répondre

2

En C, les chaînes sont terminées par un caractère avec la valeur zéro (0). Cela pourrait être écrit comme ceci:

char zero = 0; 

mais cela ne fonctionne pas dans les chaînes. Il y a une syntaxe spéciale utilisée dans les littéraux de chaîne, où la barre oblique inversée fonctionne comme une introduction de séquence d'échappement, et est suivie de diverses choses. Une telle séquence est "backslash zero", qui signifie simplement un caractère avec la valeur zéro. Ainsi, vous pouvez écrire des choses comme ceci:

char hard[] = "this\0has embedded\0zero\0characters"; 

Une autre séquence utilise une barre oblique inverse suivie par la lettre 'x' et un ou deux chiffres hexadécimaux, pour représenter le caractère avec le code indiqué. En utilisant cette syntaxe, vous pouvez écrire l'octet zéro comme '\x0' par exemple.

EDIT: En relisant la question, il existe également un support pour de telles constantes en base huit, c'est-à-dire en octal. Ils utilisent une barre oblique inverse suivie du chiffre zéro, tout comme des constantes entières littérales octales. '\00' est donc un synonyme de '\0'.

Cela est parfois utile lorsque vous devez construire une chaîne contenant des caractères non imprimables ou des caractères de contrôle spéciaux.

Il existe également un ensemble de caractères spéciaux «nommés» à un caractère, tels que '\n' pour le retour à la ligne, '\t' pour la TAB, etc.

+0

si vous voulez écrire "ce \ 0has \ 00 caractères"? Est-ce que \ 00 serait interprété comme un octet '\ 0' ou comme '\ 0', '0'? Quelle est la limite de la longueur d'une séquence d'échappement octale? – strager

+0

@strager, ne le connais pas, mais vous pouvez utiliser <"this \ 0has \ 0" "0 chars"> car C les fera fonctionner ensemble. – paxdiablo

+0

mais c lira seulement ceci à partir de <"this \ 0has \ 00 chars">, car il obtiendra la valeur nulle \ 0 qui est la condition de test pour la fin de n'importe quelle chaîne. Qu'entendez-vous par "vous pouvez écrire zéro octet comme '\ x0'"? merci pour la réponse! – mawia

2

Octal est base 8 (en utilisant les chiffres 0-7) de sorte que chaque chiffre est 3 bits:

\ 0354 = 11 101 100

hexadécimal est base 16 (en utilisant les chiffres 0-9, AF) et chaque chiffre est de 4 bits:

\ x23 = 0.010 0.011

chaînes intérieur C (tableaux de caractères/pointeurs), ils sont généralement utilisés pour coder les octets qui ne peut pas être facilement représentés.

Donc, si vous voulez une chaîne qui utilise des codes ASCII comme STX et ETX, vous pouvez faire:

char *msg = "\x02Here's my message\x03"; 
4

Celles-ci seraient utilisées pour écrire des caractères autrement non imprimables dans l'éditeur. Pour les caractères standard, ce sont les différents caractères de contrôle, car wchar pourrait être des caractères non représentés dans la police de l'éditeur.

Par exemple, cette compile dans Visual Studio 2005:

const wchar_t bom = L'\xfffe';  /* Unicode byte-order marker */ 
    const wchar_t hamza = L'\x0621'; /* Arabic Letter Hamza */ 
    const char start_of_text = '\002'; /* Start-of-text */ 
    const char end_of_text = '\003'; /* End-of-text */ 

Edit: En utilisant octal littéraux a une mise en garde intéressante. Les nombres octaux ne peuvent apparemment pas avoir plus de trois chiffres, ce qui restreint artificiellement les caractères que nous pouvons entrer.

Par exemple:

 /* Letter schwa; capital unicode code point 0x018f (octal 0617) 
     *    small unicode code point 0x0259 (octal 1131) 
     */ 
    const wchar_t Schwa2 = L'\x18f'; /* capital letter Schwa, correct */ 
    const wchar_t Schwa1 = L'\617';  /* capital letter Schwa, correct */ 
    const wchar_t schwa1 = L'\x259'; /* small letter schwa, correct */ 
    const wchar_t schwa2 = L'\1131'; /* letter K (octal 113), incorrect */ 
Questions connexes