Comment ajouter hex s'échappe dans une chaîne littérale?

lorsque vous avez string en C, vous pouvez ajouter du code hexadécimal direct à l'intérieur.

char str[] = "abcde"; // 'a', 'b', 'c', 'd', 'e', 0x00
char str2[] = "abcx12x34"; // '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'entrée des hexagones.

//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[] = "abcx12e";

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

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

cela peut marcher, mais cela échouera, si vous le mettez comme 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 demande? Lorsque vous voulez construire UTF-8 chaîne de caractères comme constante, vous devez utiliser des valeurs hex de caractère si elle est plus grande que la table ASCII peut contenir.

42
c c99
demandé sur tilz0R 2017-08-10 14:44:01

3 réponses

3 octale:

char problem[] = "abc2e";

ou diviser votre chaîne:

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

Pourquoi ces travaux:

  • contrairement à hex escapes, standard définit 3 chiffres comme montant maximum pour l'évasion octale.

    6.4.4.4 constantes des caractères

    ...

    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
    
  • chaîne de caractères la concaténation littérale est définie comme une phase de traduction ultérieure. que la conversion littérale des caractères d'évasion.

    5.1.1.2 phases de traduction

    ...

    1. chaque membre du jeu de caractères source et la séquence d'échappement dans les constantes de caractères et string literals est converti au membre correspondant du caractère d'exécution set; s'il n'y a pas de membre correspondant, il est converti en implémentation- membre défini autre que le nul (large). 8)

    2. chaîne adjacente les jetons littéraux sont concaténés.

48
répondu user694733 2017-08-10 11:59:59

puisque les littérales de chaîne sont concaténées tôt dans le processus de compilation, mais après la conversion des caractères échappés, vous pouvez simplement utiliser:

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

bien que vous puissiez préférer la séparation complète pour la 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 (mon emphase):

  1. chaque membre du jeu de caractères source et escape séquence dans les constantes de caractère et littéraux de chaîne est converti au membre correspondant du jeu de caractères d'exécution; s'il n'y a pas de membre correspondant, il est converti en un membre défini par l'implémentation autre que le caractère nul (wide).

  2. chaîne adjacente les jetons littéraux sont concaténés.

18
répondu paxdiablo 2017-08-11 01:14:46

pourquoi je demande? Quand vous voulez construire la chaîne UTF-8 comme constante, vous devez utiliser les valeurs hex de caractère est plus grand que la table ASCII peut contenir.

eh Bien, non. Vous n'avez pas . A partir de C11, vous pouvez préfixer votre constante de chaîne avec u8, qui indique au compilateur que le caractère littéral est en UTF-8.

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

(Même chose est prise en charge par le C++11 ainsi, par la voie)

4
répondu Damon 2017-08-10 13:06:24