Si j'écris putchar('\\t');
alors que j'essaie d'imprimer "\t"
au lieu d'un onglet réel, j'obtiens l'avertissement de constante multi-caractères. D'un autre côté, si j'écris putchar('\\');
je n'obtiens aucun avertissement. En regardant dans la table ASCII, il n'y a pas de caractère '\\'
, seulement '\'
. Alors pourquoi n'y a-t-il aucun avertissement? Pourquoi '\\'
un caractère mais '\\t'
est plus qu'un? Une barre oblique inverse ne peut-elle être utilisée que pour échapper à un personnage suivant?Avertissement de constante multi-caractères pour échappement t
Répondre
\\
est un caractère, t
est un caractère, donc c'est clairement deux caractères.
\\
est une séquence d'échappement, tout comme \t
; cela signifie \
.
Si vous souhaitez imprimer les deux personnages \
et t
, vous avez besoin clairement soit deux appels à putch()
ou une fonction qui prend une chaîne l'argument "\\t"
.
https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences
Vous ne pouvez pas imprimer \
et t
avec une putchar
invocation, car putchar
met un et exactement un seul caractère dans la sortie standard. Utilisez 2:
putchar('\\');
putchar('t');
Une autre option serait d'utiliser la chaîne "\\t"
avec fputs
:
fputs("\\t", stdout);
Il n'y a pas d'avertissement pour '\\'
parce que c'est une manière dont vous entrez le caractère littéral pour le caractère \
. Sur ASCII c'est aussi '\134'
et '\x5c'
.
De C11 6.4.4.4 paragraphes 2 et 4:
Un caractère entier constant est une séquence d'un ou plusieurs caractères multi-octets enfermés dans des guillemets simples, comme dans
'x'
. [...] Avec quelques exceptions détaillées plus loin, les éléments de la séquence sont tous les membres du jeu de caractères source; ils sont mappés d'une manière définie par l'implémentation aux membres du jeu de caractères d'exécution.[...]
Le guillemet
"
et question marque?
sont représentables soit par eux-mêmes ou par les séquences d'échappement\"
et\?
, respectivement, mais le simple citation'
et le backslash\
doivent être représentés, respectivement, par les séquences d'échappement\'
et\\
.
La raison pour laquelle vous obtenez un avertissement est que le comportement est tout à fait défini par l'implémentation. Dans C11 J.3.4 ce qui suit est répertorié comme comportement de l'implémentation:
La valeur d'une constante contenant plus d'un caractère de caractères entier ou contenant un caractère ou séquence d'échappement qui ne correspond pas à un caractère d'exécution sur un seul octet (6,4 .4.4).
Depuis '\\'
contient une séquence d'échappement qui correspond à un caractère d'exécution sur un seul octet \
, il n'y a pas des pièges, la mise en œuvre définie et rien à mettre en garde; mais \\t
contient 2 caractères: \
et t
, et il ne ferait pas ce que vous voulez portably.
Rechercher * séquence d'échappement * –