printf et wprintf en code C simple

J’ai un problème lorsque wprintf fonctions printf et wprintf ensemble dans le code. Si la chaîne normale est imprimée en premier, alors wprintf ne fonctionne pas. Si wprintf abord wprintf alors printf ne fonctionnera pas.

 #include  #include  #include  #include  int main() { setlocale(LC_ALL,""); printf("No printing!\n"); wprintf(L"Printing!\n"); wprintf(L"Wide char\n"); printf("ASCII\n"); return 0; } 

Les sorties:

 No printing! ASCII 

Tandis que

 #include  #include  #include  #include  int main() { setlocale(LC_ALL,""); wprintf(L"Printing!\n"); printf("No printing!\n"); wprintf(L"Wide char\n"); printf("ASCII\n"); return 0; } 

les sorties:

 Printing! Wide char 

J’utilise gcc (GCC) 4.6.1 20110819 avec glibc 2.14 sur Linux 3.0 64 bits.

C’est à prévoir; votre code appelle un comportement indéfini. Selon le standard C, chaque stream FILE est associé à une “orientation” (“octet” ou “large”) définie par la première opération effectuée sur celui-ci et pouvant être inspectée avec la fonction fwide . les conflits d’orientation avec l’orientation du stream entraînent un comportement indéfini.

Pour compléter la réponse acceptée de R ..:

Bien que cela soit très rarement fait, vérifier le code de retour de printf / wprintf indiquerait plus clairement que l’un d’eux ne fonctionne pas (il devrait retourner -1 pour la fonction d’impression qui est invalide selon l’orientation actuelle du stream).

Malheureusement, un modèle commun de vérification des erreurs dans les fonctions de bibliothèque standard:

 if (wprintf(...) == -1) { perror("wprintf"); ... } 

Peut ne pas aider beaucoup ici: si le stream est défini pour générer des caractères non larges et que vous appelez wprintf , errno peut ne pas l’être et vous obtiendrez wprintf: Success , qui ne fournit pas beaucoup d’informations.

C’est donc un problème un peu difficile à comprendre lorsque vous ne connaissez pas l’orientation des stream dans les caractères.