2017-09-25 14 views
1

Je suis en train d'écrire un message contenant « alpha = abcd » dans un fichier texte en utilisant le code suivant:fwprintf: seul le premier caractère d'un argument large tableau de caractères est copié sur la sortie

#include <stdio.h> 
#include <wchar.h> 

int 
main() 
{ 
     const wchar_t *a = L"abcd", *msg = L"alpha = %s\n"; 
     FILE   *f = fopen("./deleteme", "a"); 

     fwprintf(f, msg, a); 
     fclose(f); 
} 

Cependant , après la compilation et l'exécution du programme que je reçois cette sortie à la place:

alpha = a

Pourquoi seul le premier caractère de la const a est copié à la sortie?

Répondre

2

Vous devez changer:

L"alpha = %s\n"; 

à:

L"alpha = %S\n"; 

L'argument (a = L"abcd") vous essayez d'imprimer est une grande chaîne, et donc vous avez besoin %S (majuscule) au lieu de %s (minuscules). L'utilisation de spécificateurs de format incorrects pour les fonctions similaires à printf est un comportement indéfini.

Lire le documentation for printf format specifiers.

+0

Ah, je n'étais pas au courant de cette information - Merci! – Kais

1

Avec un compilateur compatible C99, utilisez "%ls".

Si un agent de modification de longueur l est présent, l'argument doit être un pointeur vers l'élément initial d'un tableau de type wchar_t. C11dr §7.29.2.1 10.

// const wchar_t *msg = L"alpha = %s\n"; 
const wchar_t *msg = L"alpha = %ls\n"; 
+0

Intéressant .. merci pour l'information. – Kais

+0

@Kais Est-ce que cela fonctionne pour votre compilateur? Si non, quel compilateur/version utilisez-vous? – chux

+0

Oui. BTW, j'utilise gcc 6.3.0 sous Linux. – Kais