66 votes

Comment ajouter correctement des échappements hexadécimaux dans un littéral de chaîne?

Lorsque vous avez chaîne en C, vous pouvez ajouter directement le code hex à l'intérieur.

char str[] = "abcde"; // 'a', 'b', 'c', 'd', 'e', 0x00
char str2[] = "abc\x12\x34"; // 'a', 'b', 'c', 0x12, 0x34, 0x00

Les deux exemples ont 6 octets en mémoire. Maintenant, le problème existe si vous souhaitez ajouter de la valeur [a-fA-F0-9] après l'hex d'entrée.

//I want: 'a', 'b', 'c', 0x12, 'e', 0x00
//Error, hex is too big because last e is treated as part of hex thus becoming 0x12e
char problem[] = "abc\x12e";

Solution Possible est de les remplacer après la définition.

//This will work, bad idea
char solution[6] = "abcde";
solution[3] = 0x12;

Cela peut fonctionner, mais ce sera un échec, si vous le mets en const.

//This will not work
const char solution[6] = "abcde";
solution[3] = 0x12; //Compilation error!

Comment insérer correctement e après \x12 , sans déclencher d'erreur?


Pourquoi je pose la question? Lorsque vous voulez construire UTF-8 chaîne de caractères comme une constante, vous devez utiliser les valeurs hexadécimales de caractère, si elle est plus grande que la table ASCII peut contenir.

77voto

user694733 Points 4040

3 octale:

char problem[] = "abc\022e";

ou diviser votre chaîne:

char problem[] = "abc\x12" "e";

Pourquoi ces travaux:

  • Contrairement à hex échappe, norme définit 3 chiffres montant maximum pour octal échapper.

    6.4.4.4 constantes de Caractère

    ...

    octal-escape-sequence:
        \ octal-digit
        \ octal-digit octal-digit
        \ octal-digit octal-digit octal-digit
    

    ...

    hexadecimal-escape-sequence:
        \x hexadecimal-digit
        hexadecimal-escape-sequence hexadecimal-digit
    
  • Un littéral de chaîne de concaténation est définie comme une traduction d'une version ultérieure de la phase de caractère d'échappement littéral de conversion.

    5.1.1.2 Traduction phases

    ...

    1. Chaque source de jeu de caractères membre et d'échapper à la séquence de caractères constantes et les littéraux de chaîne est convertie à la membre correspondant de l'exécution de caractère ensemble; si il n'y a pas de membre correspondant, il est converti dans la mise en œuvre- membre défini autre que le nul (large) de caractère. 8)

    2. Adjacent littéral de chaîne de tokens sont concaténées.

28voto

paxdiablo Points 341644

Depuis les littéraux de chaîne sont concateneated tôt dans le processus de compilation, mais après les échappés-conversion de caractères, vous pouvez utiliser:

char problem[] = "abc\x12" "e";

si vous préférez une séparation totale pour plus de lisibilité:

char problem[] = "abc" "\x12" "e";

Pour la langue des avocats parmi nous, ce qui est couvert dans C11 5.1.1.2 Translation phases (je souligne):

  1. Chaque source de jeu de caractères membre et de la séquence d'échappement de caractères constantes et les littéraux de chaîne est convertie à la membre correspondant de l'exécution du jeu de caractères; si il n'y a pas de membre correspondant, il est converti dans la mise en œuvre définies par l'autre membre que le nul (large) de caractère.

  2. Adjacent littéral de chaîne de tokens sont concaténées.

7voto

Damon Points 26437

Pourquoi je demande? Lorsque vous voulez construire une chaîne UTF-8 comme constante, vous devez utiliser des valeurs hexadécimales d'un caractère plus grand que la table ASCII ne peut contenir.

Et bien non. Tu n'es pas obligé . A partir de C11, vous pouvez préfixer votre constante de chaîne avec u8 , ce qui indique au compilateur que le littéral de caractère est en UTF-8.

 char solution[] = u8"no need to use hex-codes á駵";
 

Soit dit en passant, la même chose est supportée par C ++ 11

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X