2017-07-23 3 views
-3

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

+1

Rechercher * séquence d'échappement * –

Répondre

2

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.