printf ()- Imprimer les caractères formatés

Format

#include <stdio.h>
int printf(const char *format-string, argument-list);

Niveau de langue

American National Standards Institute

Unités d'exécution protégées

Oui

Sensible à l'environnement local

Le comportement de cette fonction peut être affecté par les catégories LC_CTYPE et LC_NUMERIC de l'environnement local en cours. Le comportement peut également être affecté par la catégorie LC_UNI_CTYPE de l'environnement local en cours si LOCALETYPE (*LOCALEUCS2) ou LOCALETYPE (*LOCALEUTF) est spécifié dans la commande de compilation. Pour plus d'informations, voir Présentation des CCSID et des environnements locaux.

Description

La fonction printf() formate et imprime une série de caractères et de valeurs dans le flux de sortie standard stdout. Les spécifications de format, commençant par le signe de pourcentage (%), déterminent le format de sortie pour toute liste d'arguments suivant la chaîne de format. La chaîne de format est une chaîne de caractères multi-octets commençant et se terminant par son état de décalage initial.

La chaîne de format est lue de gauche à droite. Lorsque la première spécification de format est trouvée, la valeur du premier argument après format-string est convertie et imprimée conformément à la spécification de format. La deuxième spécification de format entraîne la conversion et l'impression du deuxième argument après format-string , et ainsi de suite jusqu'à la fin de la chaîne de format . S'il existe plus d'arguments que de spécifications de format, les arguments supplémentaires sont évalués et ignorés. Les résultats ne sont pas définis s'il n'y a pas suffisamment d'arguments pour toutes les spécifications de format.

Une spécification de format se présente sous la forme suivante:

Lire le diagramme de syntaxeIgnorer le diagramme de syntaxe graphique%indicateurslargeur.précisionhLlllHDDDl'année en cours

Les conversions peuvent être appliquées au nième argument après la chaîne-format dans la liste des arguments, plutôt qu'à l'argument non utilisé suivant. Dans ce cas, le caractère de conversion% est remplacé par la séquence %n$, où n est un entier décimal compris entre 1 et NL_ARGMAX, ce qui donne la position de l'argument dans la liste des arguments. Cette fonction permet de définir des chaînes de format qui sélectionnent des arguments dans un ordre adapté à des langues spécifiques.

La spécification de format alternatif se présente sous la forme suivante:
Lire le diagramme de syntaxeIgnorer le diagramme de syntaxe graphique%arg-number$indicateurs largeur.précisionhLlllHDDDl'année en cours

Comme alternative, des entrées spécifiques de la liste d'arguments peuvent être affectées à l'aide de la spécification de format décrite dans le diagramme précédent. Cette spécification de format et la spécification de format précédente ne peuvent pas être mélangées dans le même appel à printf(). Sinon, des résultats imprévisibles peuvent se produire.

La valeur arg-number est une constante entière positive où 1 fait référence à la première entrée de la liste d'arguments. Arg-number ne peut pas être supérieur au nombre d'entrées de la liste d'arguments, sinon les résultats ne sont pas définis. Arg-number ne peut pas être supérieur à NL_ARGMAX.

Dans les chaînes de format contenant la forme %n$ des spécifications de conversion, les arguments numérotés de la liste d'arguments peuvent être référencés à partir de la chaîne de format autant de fois que nécessaire.

Dans les chaînes de format contenant la forme %n$ d'une spécification de conversion, la largeur ou la précision d'une zone peut être indiquée par la séquence * m$, où m est un entier décimal compris entre 1 et NL_ARGMAX donnant la position dans la liste des arguments (après l'argument de format) d'un argument entier contenant la largeur ou la précision de la zone, par exemple:

printf("%1$d:%2$.*3$d:%4$.*3$d\n", hour, min, precision, sec);

La chaîne de format peut contenir soit des spécifications d'argument numérotées (c'est-à-dire %n$ et * m$), soit des spécifications d'argument non numérotées (c'est-à-dire% et *), mais normalement pas les deux. La seule exception à cette règle est que%% peut être mélangé avec le formulaire %n$. Les résultats de la combinaison de spécifications d'arguments numérotés et non numérotés dans une chaîne de chaîne de format ne sont pas définis. Lorsque des spécifications d'arguments numérotés sont utilisées, la spécification du nième argument requiert que tous les arguments de début, du premier au (n-1) ième, soient spécifiés dans la chaîne de format.

Chaque zone de la spécification de format est un caractère unique ou un nombre indiquant une option de format particulière. Le caractère type , qui apparaît après la dernière zone de format facultative, détermine si l'argument associé est interprété comme un caractère, une chaîne, un nombre ou un pointeur. La spécification de format la plus simple contient uniquement le signe de pourcentage et un caractère type (par exemple, %s).

Les zones facultatives suivantes contrôlent d'autres aspects du formatage:
Zone
Description
indicateurs
Justification de la sortie et de l'impression des signes, des blancs, des décimales, des préfixes octaux et hexadécimaux, ainsi que la sémantique de l'unité de précision wchar_t .
largeur
Nombre minimal d'octets de sortie.
précision
Voir Tableau 2.
h, l, ll, L, H, D, DD
Taille de l'argument attendue:
h
Préfixe avec les types d, i, o, u, x, Xet n qui indique que l'argument est un entier court ou un entier court non signé.
l
Préfixe avec les types d, i, o, u, x, Xet n qui indique que l'argument est un entier long ou entier long non signé.
ll
Préfixe avec les types d, i, o, u, x, Xet n qui indique que l'argument est un long long int ou long long intnon signé.
L
Préfixe avec les types a, A, e, E, f, F, gou G qui indique que l'argument est long double.
H
Un préfixe avec les types a, A, e, E, f, F, gou G qui indique que l'argument est _Decimal32.
D
Un préfixe avec les types a, A, e, E, f, F, gou G qui indique que l'argument est _Decimal64.
JJ
Préfixe avec les types a, A, e, E, f, F, gou G qui indique que l'argument est _Decimal128.

Chaque zone de la spécification de format est examinée en détail ci-dessous. Si un signe de pourcentage (%) est suivi d'un caractère qui n'a aucune signification en tant que zone de format, le comportement n'est pas défini. Une exception à ce comportement est %%. Pour imprimer un signe de pourcentage, utilisez %%.

Les caractères type et leur signification sont indiqués dans le tableau suivant:

Tableau 1. Caractères de type
Caractère Argument Format de sortie
a virgule flottante Pour les nombres à virgule flottante non décimale, valeur signée au format [-] 0xh.hhhhp [signe]ddd, où h est un chiffre hexadécimal unique, hhhh est un ou plusieurs chiffres hexadécimaux, ddd est un ou plusieurs chiffres décimaux et signe est + ou-. Le nombre de chiffres hexadécimaux après le séparateur décimal est égal à la précision demandée.

Pour les nombres à virgule flottante décimale, si la précision est manquante, le formatage de style f ou e est utilisé en fonction des critères suivants.

  • Le formatage de style f est utilisé lorsque l' exposant quantique de la valeur est inférieur ou égal à 0 mais supérieur ou égal à-(n+ 5). L' exposant quantique d'un nombre peut être déterminé en appelant la fonction quantexp64(). n est le nombre de chiffres de la séquence de chiffres (y compris les zéros de fin) lorsque le séparateur décimal est ignoré. Par exemple :

    0.000005

    contient 1 chiffre dans la séquence de chiffres, n = 1

    0.0000050

    contient 2 chiffres dans la séquence de chiffres, n = 2

    12.30

    contient 4 chiffres dans la séquence de chiffres, n = 4

    La précision est égale à la valeur absolue de l' exposant quantique de la valeur.

  • Le formatage de style e est utilisé lorsque l' exposant quantique de la valeur ne répond pas aux critères de style f . La précision est égale à n-1. Le format de style e d'une valeur à virgule flottante décimale est le même que le format de style e d'une valeur à virgule flottante non décimale avec deux exceptions: a) si la valeur est égale à 0, l'exposant est égal à l' exposant quantique de la valeur, et b) l'exposant est toujours donné avec le nombre minimal de chiffres requis (c'est-à-dire que l'exposant ne contient jamais de zéro non significatif). Par exemple :

    0.0000000 produit 0e-7

    -1870 produit -1.87e+3

Si le modificateur de précision est présent et au moins aussi grand que la précision de la valeur, la conversion est comme si le modificateur de précision était manquant. Si le modificateur de précision est présent et inférieur à la précision de la valeur, la valeur est d'abord arrondie au nombre de chiffres spécifié par le modificateur de précision. Le résultat est ensuite converti comme si le modificateur de précision était manquant.
A virgule flottante Identique au format a, sauf que les caractères alphabétiques en majuscules sont utilisés à la place des caractères alphabétiques en minuscules.
d, i Nombre entier Entier décimal signé.
u Nombre entier Entier décimal non signé.
o Nombre entier Entier octal non signé.
x Nombre entier Entier hexadécimal non signé, utilisant abcdef.
X Nombre entier Entier hexadécimal non signé, utilisant ABCDEF.
D (n, p) Décimale condensée Il est au format [-] dddd.dddd où le nombre de chiffres après le séparateur décimal est égal à la précision de la spécification. Si la précision est manquante, la valeur par défaut est p; si la précision est égale à zéro et que l'indicateur # n'est pas spécifié, aucun séparateur décimal n'apparaît. Si n et p sont *, un argument de la liste d'arguments fournit la valeur. n et p doivent précéder la valeur formatée dans la liste d'arguments. Au moins un caractère apparaît avant un séparateur décimal. La valeur est arrondie au nombre de chiffres approprié.
f virgule flottante Valeur signée au format [-]dddd.dddd, où dddd correspond à un ou plusieurs chiffres décimaux. Le nombre de chiffres avant le séparateur décimal dépend de l'ampleur du nombre. Le nombre de chiffres après le séparateur décimal est égal à la précision demandée.2
F virgule flottante Identique au format f, sauf que les caractères alphabétiques en majuscules sont utilisés à la place des caractères alphabétiques en minuscules.2
e virgule flottante Valeur signée au format [-]d.dddd e[signe]ddd, où d est un chiffre décimal unique, dddd est un ou plusieurs chiffres décimaux, ddd est 2 chiffres décimaux ou plus et signe est + ou-.2
E virgule flottante Identique au format e , sauf que les caractères alphabétiques en majuscules sont utilisés à la place des caractères alphabétiques en minuscules.2
g virgule flottante Valeur signée imprimée au format f ou e . Le format e n'est utilisé que lorsque l'exposant de la valeur est inférieur à -4 ou supérieur ou égal à précision. Les zéros de fin sont tronqués et le séparateur décimal n'apparaît que si un ou plusieurs chiffres le suivent.2
G virgule flottante Identique au format g, sauf que les caractères alphabétiques en majuscules sont utilisés à la place des caractères alphabétiques en minuscules.2
c Caractère (octet) Caractère unique.
s Chaîne Caractères (octets) imprimés jusqu'au premier caractère nul (\0) ou jusqu'à ce que la précision soit atteinte.
n Pointeur vers un entier Nombre de caractères (octets) écrits jusqu'à présent dans le flux ou la mémoire tampon ; cette valeur est stockée dans l'entier dont l'adresse est indiquée comme argument.
p Pointeur Pointeur converti en une séquence de caractères imprimables. Il peut s'agir de l'un des éléments suivants:
  • pointeur d'espace
  • pointeur système
  • pointeur d'appel
  • pointeur de procédure
  • pointeur ouvert
  • pointeur d'interruption
  • pointeur de données
  • pointeur de libellé
lc ou C caractère large Le caractère (wchar_t) est converti en caractère multi-octet comme par un appel à wctomb (), et ce caractère est imprimé.1
ls ou S caractère large Les caractères (wchar_t) jusqu'au premier caractère null (wchar_t) (L\0), ou jusqu'à ce que la précision soit atteinte, sont convertis en caractères multi-octets, comme par un appel à wcstombs (), et ces caractères sont imprimés. Si l'argument est une chaîne nulle, (null) est imprimé.1
Remarque :
  1. Pour plus d'informations, voir la documentation de la fonction wctomb() ou la documentation de la fonction wcstombs() . Vous pouvez également trouver des informations supplémentaires dans Caractères larges.
  2. Si les spécificateurs de taille de format H, D ou DD ne sont pas utilisés, seuls 15 chiffres significatifs de sortie sont garantis.

La liste suivante présente le format des valeurs imprimées pour les pointeurs IBM® i et fournit une brève description des composants des valeurs imprimées.

Pointeur d'espace: SPP:Context :Object :Offset :AG

Context: type, sous-type et nom du contexte
Object: type, sous-type et nom de l'objet
Offset: offset in the space
AG: ID du groupe d'activation

Pointeur système: SYP:Context :Object :Auth :Index :AG

Context: type, sous-type et nom du contexte
Objet: type, sous-type et nom de l'objet
Auth: authority
Index: Index associé au pointeur
AG: ID groupe d'activation

Pointeur d'appel: IVP:Index :AG

Index: Index associé au pointeur
AG:      ID groupe d'activation

Pointeur de procédure: PRP:Index :AG

Index: Index associé au pointeur
AG: ID groupe d'activation

Pointeur d'interruption: SUP:Index :AG

Index: Index associé au pointeur
AG: ID groupe d'activation

Pointeur de données:  DTP:Index :AG

Index: Index associé au pointeur
AG: ID groupe d'activation

Pointeur de libellé: LBP:Index :AG

Index: Index associé au pointeur
AG: ID groupe d'activation

Pointeur NULL: NULL

Les restrictions suivantes s'appliquent à l'impression et à la numérisation des pointeurs sur le système d'exploitation IBM i :
  • Si un pointeur est imprimé et numérisé à partir du même groupe d'activation, le pointeur numérisé sera comparé au pointeur imprimé.
  • Si une fonction de la famille scanf() analyse un pointeur qui a été imprimé par un autre groupe d'activation, la fonction de la famille scanf() définit le pointeur sur NULL.
  • Si un pointeur est imprimé dans un environnement à espace mémoire à téraoctets, seule la valeur hexadécimale du pointeur est imprimée. Ces résultats sont identiques à ceux obtenus lors de l'utilisation de%#p.

Le spécificateur de format%#p offre de bien meilleures performances que le spécificateur de format %p.

Pour plus d'informations sur l'utilisation des pointeurs IBM i , voir ILE C/C++ Programmer's Guide .

Si une valeur à virgule flottante INFINITY ou Not-a-Number (NaN) est formatée au format a, e, f ou g, la chaîne de sortie estinfinityounan. Si une valeur à virgule flottante INFINITY ou Not-A-Number (NaN) est formatée au format A, E, F ou G, la chaîne de sortie estINFINITYouNAN.

Les caractères flag et leurs significations sont les suivants (notez que plusieurs flag peuvent apparaître dans une spécification de format):

Indicateur Signification Par défaut
- Gauche-Justifier le résultat dans la largeur de la zone. Justification à droite.
+ Préfixez la valeur de sortie avec un signe (+ ou-) si la valeur de sortie est de type signé. Le signe apparaît uniquement pour les valeurs signées négatives (-).
vide('') Préfixez la valeur de sortie avec un blanc si la valeur de sortie est signée et positive. L'indicateur + remplace l'indicateur vide si les deux apparaissent, et une valeur signée positive sera générée avec un signe. Aucun blanc.
# Lorsqu'il est utilisé avec les formats o, xou X , l'indicateur # préfixe toute valeur de sortie non nulle avec 0, 0x ou 0X, respectivement. Aucun préfixe.
Lorsqu'il est utilisé avec les formats D (n, p), a, A, e, E, f ou F , l'indicateur # force la valeur de sortie à contenir un séparateur décimal dans tous les cas. Le séparateur décimal apparaît uniquement si des chiffres le suivent.
Lorsqu'il est utilisé avec les formats g ou G , l'indicateur # force la valeur de sortie à contenir un séparateur décimal dans tous les cas et empêche la troncature des zéros de fin. Le séparateur décimal apparaît uniquement si des chiffres le suivent ; les zéros de fin sont tronqués.
Lorsqu'il est utilisé avec le format ls ou S, l'indicateur # permet de mesurer la précision en caractères, quelle que soit la taille du caractère. Par exemple, si des caractères mono-octet sont imprimés, une précision de 4 entraîne l'impression de 4 octets. Si des caractères codés sur deux octets sont imprimés, une précision de 4 entraîne l'impression de 8 octets. La précision indique le nombre maximal d'octets à générer.
Lorsqu'il est utilisé avec le format p , l'indicateur # convertit le pointeur en chiffres hexadécimaux. Ces chiffres hexadécimaux ne peuvent pas être reconvertis en pointeur, sauf dans un environnement à espace mémoire à téraoctets. Pointeur converti en une séquence de caractères imprimables.
0 Lorsqu'il est utilisé avec les formats d, i, D (n, p) o, u, x, X, a, A, e, E, f, F, gou G , l'indicateur 0 provoque le remplissage de la sortie par 0pour la largeur du champ. L'indicateur 0 est ignoré si la précision est spécifiée pour un entier ou si l'indicateur - est spécifié. Remplissage de l'espace. Pas de remplissage d'espace pour D (n, p).

L'indicateur # ne doit pas être utilisé avec les types c, lc, d, i, uou s .

Largeur est un entier décimal non négatif qui contrôle le nombre minimal de caractères imprimés. Si le nombre de caractères (octets) dans la valeur de sortie est inférieur à la largeurspécifiée, des blancs sont ajoutés à gauche ou à droite (selon que l'indicateur - est spécifié) jusqu'à ce que la largeur minimale soit atteinte.

Largeur n'entraîne jamais la troncature d'une valeur ; si le nombre de caractères (octets) dans la valeur de sortie est supérieur à la largeurspécifiée ou si largeur n'est pas indiqué, tous les caractères de la valeur sont imprimés (conformément à la spécification precision ).

Pour le type ls ou S, width est spécifié en octets. Si le nombre d'octets dans la valeur de sortie est inférieur à la largeur spécifiée, des blancs à un octet sont ajoutés à gauche ou à droite (selon que l'indicateur - est spécifié) jusqu'à ce que la largeur minimale soit atteinte.

La spécification width peut être un astérisque (*), auquel cas un argument de la liste d'arguments fournit la valeur. L'argument width doit précéder la valeur formatée dans la liste des arguments.

Précision est un entier décimal non négatif précédé d'un point, qui indique le nombre de caractères à imprimer ou le nombre de décimales. Contrairement à la spécification width , la précision peut entraîner la troncature de la valeur de sortie ou l'arrondi d'une valeur à virgule flottante ou d'une valeur décimale condensée .

La spécification precision peut être un astérisque (*), auquel cas un argument de la liste d'arguments fournit la valeur. L'argument precision doit précéder la valeur formatée dans la liste des arguments.

L'interprétation de la valeur precision et de la valeur par défaut lorsque la précision est omise dépend du type, comme illustré dans le tableau suivant:

Tableau 2. Valeurs de précision
Type Signification Par défaut
  
A
Pour les nombres à virgule flottante non décimale, précision indique le nombre de chiffres hexadécimaux à imprimer après le séparateur décimal.

Pour les nombres à virgule flottante décimale, précision indique le nombre de chiffres significatifs à imprimer.

Pour les nombres à virgule flottante non décimale, la précision par défaut est suffisante pour une représentation exacte de la valeur. Si la précision est 0, aucun séparateur décimal n'est imprimé. Pour les nombres décimaux à virgule flottante, la précision par défaut est suffisante pour une représentation exacte de la valeur. Pour plus de détails sur le format utilisé, voir Tableau 1 .
   i
d
u
o
x
X
Précision indique le nombre minimal de chiffres à imprimer. Si le nombre de chiffres dans l'argument est inférieur à la précision, la valeur de sortie est complétée à gauche par des zéros. La valeur n'est pas tronquée lorsque le nombre de chiffres dépasse la précision. Si la précision est 0 ou omise entièrement, ou si le point (.) apparaît sans nombre après lui, la précision est définie sur 1.
   f
F
D (n, p)
e
E
Précision indique le nombre de chiffres à imprimer après le séparateur décimal. Le dernier chiffre imprimé est arrondi. La précision par défaut pour f, F, e et E est six. La précision par défaut pour D (n, p) est p. Si la précision est 0 ou si le point apparaît sans nombre, aucun séparateur décimal n'est imprimé.
   g
G
Précision indique le nombre maximal de chiffres significatifs imprimés. Tous les chiffres significatifs sont imprimés. La valeur par défaut de précision est six.
   c
Aucun effet. Le caractère est imprimé.
lc
Aucun effet. Le caractère wchar_t est converti et le caractère multioctet résultant est imprimé.
   s
Précision indique le nombre maximal de caractères (octets) à imprimer. Les caractères (octets) dépassant la précision ne sont pas imprimés. Les caractères sont imprimés jusqu'à ce qu'un caractère null soit rencontré.
ls
Précision indique le nombre maximal d'octets à imprimer. Les octets dépassant la précision ne sont pas imprimés ; toutefois, l'intégrité multioctet est toujours préservée. Les caractères wchar_t sont convertis et les caractères multi-octets qui en résultent sont imprimés.

Valeur renvoyée

La fonction printf() renvoie le nombre d'octets imprimés. La valeur de errno peut être définie sur:
Valeur
Signification
MODE d'EBAD
Le mode de fichier indiqué n'est pas valide.
CONVERT
Une erreur de conversion s'est produite.
ERREUR D'E-S
Une erreur d'E-S irrémédiable s'est produite.
EIORECERR
Une erreur d'E-S remédiable s'est produite.
EILSEQ
Une séquence de caractères multi-octets non valide a été détectée.
EPUTANDGET
Une opération d'écriture interdite s'est produite après une opération de lecture.
ESTDOUT
stdout ne peut pas être ouvert.
Remarque: le caractère de base de la fonction printf() est sensible à l'environnement local. Le caractère de base est le séparateur décimal à utiliser pour le caractère # du paramètre de chaîne de format pour les types de format D (n, p), a, A, e, E, f, F, g et G.

Exemples

Cet exemple imprime des données dans divers formats.
#include <stdio.h>                                               
#include <stdlib.h>                                              
                                                                 
int main(void)                                                   
{                                                                
    char ch = 'h', *string = "computer";                         
    int count = 234, hex = 0x10, oct = 010, dec = 10;            
    double fp = 251.7366;                                        
    wchar_t wc = (wchar_t)0x0058;                                
    wchar_t ws[4];                                                       
                                                     
    printf("1234567890123%n4567890123456789\n\n", &count);          
    printf("Value of count should be 13; count = %d\n\n", count);   
    printf("%10c%5c\n", ch, ch);                                    
    printf("%25s\n%25.4s\n\n", string, string);                     
    printf("%f    %.2f    %e    %E\n\n", fp, fp, fp, fp);           
    printf("%i    %i     %i\n\n", hex, oct, dec);                   
}                                                                   
/*****************  Output should be similar to:  ***************** 
                                                                    
234   +234    000234     EA    ea     352                           
                                                                    
12345678901234567890123456789                                       
                                                                    
Value of count should be 13; count = 13                             
 
                                                                      
  h    h                                                              
          computer                                                    
              comp                                                    
                                                                      
251.736600    251.74    2.517366e+02    2.517366E+02                  
                                                                      
16    8     10                                                        
 
*******************************************************************/  

Exemple utilisant printf()

     #include <stdio.h>
     #include <stdlib.h>
     #include <locale.h>
     /* This program is compiled with LOCALETYPE(*LOCALEUCS2) and             */
     /* SYSIFCOPT(*IFSIO)                                               */
     /* We will assume the locale setting is the same as the CCSID of the */
     /* job.  We will also assume any files involved have a CCSID of      */
     /* 65535 (no convert).  This way if printf goes to the screen or     */
     /* a file the output will be the same.                               */
    int main(void)
    {
        wchar_t wc = 0x0058;     /* UNICODE X */
        wchar_t ws[4];
        setlocale(LC_ALL,
         "/QSYS.LIB/EN_US.LOCALE"); /* a CCSID 37 locale */
        ws[0] = 0x0041;        /* UNICODE A   */
        ws[1] = (wchar_t)0x0042;        /* UNICODE B   */
        ws[2] = (wchar_t)0x0043;        /* UNICODE C   */
        ws[3] = (wchar_t)0x0000;
        /* The output displayed is CCSID 37  */
        printf("%lc   %ls\n\n",wc,ws);
        printf("%lc   %.2ls\n\n",wc,ws);

        /* Now let's try a mixed-byte CCSID example  */
        /* You would need a device that can handle mixed bytes to  */
        /* display this correctly.                         */

        setlocale(LC_ALL,
        "/QSYS.LIB/JA_JP.LOCALE");/* a CCSID 5026 locale */

        /* big A means an A that takes up 2 bytes on the screen   */
        /* It will look bigger then single byte A                 */
        ws[0] = (wchar_t)0xFF21;        /* UNICODE big A   */
        ws[1] = (wchar_t)0xFF22;        /* UNICODE big B   */
        ws[2] = (wchar_t)0xFF23;        /* UNICODE big C   */
        ws[3] = (wchar_t)0x0000;
        wc = 0xff11;                    /* UNICODE big 1   */

        printf("%lc   %ls\n\n",wc,ws);

        /* The output of this printf is not shown below and it   */
        /* will differ depending on the device you display it on,*/
        /* but if you looked at the string in hex it would look  */
        /* like this:  0E42F10F404040400E42C142C242C30F          */
        /* 0E is shift out, 0F is shift in, and 42F1 is the      */
        /* big 1 in CCSID   5026  */

        printf("%lc   %.4ls\n\n",wc,ws);

        /* The output of this printf is not shown below either. */
        /* The hex would look like:                             */
        /* 0E42F10F404040400E42C10F                             */
        /* Since the precision is in bytes we only get 4 bytes  */
        /* of the string.         */

        printf("%lc   %#.2ls\n\n",wc,ws);

        /* The output of this printf is not shown below either. */
        /* The hex would look like:                             */
        /* 0E42F10F404040400E42C142C20F                         */
        /* The # means precision is in characters reguardless   */
        /* of size.  So we get 2 characters of the string.      */
    }
 /*****************  Output should be similar to:  *****************


 X     ABC

 X     AB

 *******************************************************************/
 

Exemple utilisant printf()

 #include <stdio.h>
 #include <stdlib.h>
 #include <locale.h>
 /* This program is compile LOCALETYPE(*LOCALE)  and               */
 /* SYSIFCOPT(*IFSIO)    */
 int main(void)
 {
     wchar_t wc = (wchar_t)0x00C4;     /*  D */
     wchar_t ws[4];
     ws[0] = (wchar_t)0x00C1;        /* A   */
     ws[1] = (wchar_t)0x00C2;        /* B   */
     ws[2] = (wchar_t)0x00C3;        /* C   */
     ws[3] = (wchar_t)0x0000;
     /* The output displayed is CCSID 37  */
     printf("%lc   %ls\n\n",wc,ws);

     /* Now let's try a mixed-byte CCSID example  */
     /* You would need a device that can handle mixed bytes to  */
     /* display this correctly.                         */

     setlocale(LC_ALL,
     "/QSYS.LIB/JA_JP.LOCALE"); /* a CCSID 5026 locale */

     /* big A means an A that takes up 2 bytes on the screen   */
     /* It will look bigger than single byte A                 */

     ws[0] = (wchar_t)0x42C1;        /* big A   */
     ws[1] = (wchar_t)0x42C2;        /* big B   */
     ws[2] = (wchar_t)0x42C3;        /* big C   */
     ws[3] = (wchar_t)0x0000;
     wc = 0x42F1;                    /* big 1   */

     printf("%lc   %ls\n\n",wc,ws);

     /* The output of this printf is not shown below and it   */
     /* will differ depending on the device you display it on,*/
     /* but if you looked at the string in hex it would look  */
     /* like this:  0E42F10F404040400E42C142C242C30F          */
     /* 0E is shift out, 0F is shift in, and 42F1 is the      */
     /* big 1 in CCSID   5026  */

     printf("%lc   %.4ls\n\n",wc,ws);

     /* The output of this printf is not shown below either. */
     /* The hex would look like:                             */
     /* 0E42F10F404040400E42C10F                             */
     /* Since the precision is in bytes we only get 4 bytes  */
     /* of the string.         */

     printf("%lc   %#.2ls\n\n",wc,ws);

     /* The output of this printf is not shown below either. */
     /* The hex would look like:                             */
     /* 0E42F10F404040400E42C142C20F                         */
     /* The # means precision is in characters regardless   */
     /* of size.  So we get 2 characters of the string.      */
 }
 /*****************  Output should be similar to:  *****************


 D     ABC


 *******************************************************************/
 

Rubriques connexes