Comment imprimer des caractères de boîte en C (Windows)

Comment peut-on imprimer un tiret en C?

Un de ceux-là: –

Chaque fois que je le fais: printf("—") Je reçois juste un ù dans le terminal.

Je vous remercie.

EDIT: Le code suivant est supposé imprimer une grid à la recherche de X avec des tirets pour les lignes horizontales.

 int main () { char grid[3][3] = {{'a', 'a', 'a'}, {'a', 'a', 'a'}, {'a', 'a', 'a'}}; int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { if (j != 0) { printf("|"); } printf(" %c ", grid[i][j]); } if (i != 2) { printf("\n——————————————\n"); } } return 0; } 

Sortie: (Les “ù” devraient être “-” s)

  a | a | a ùùùùùùùùùùùù a | a | a ùùùùùùùùùùùù a | a | a 

EDIT: Je suis sur Windows 10 x64 en utilisant Codeblocks 16.01 avec C11.

EDIT: J’ai été informé des caractères de la boîte et la question a été transformée en comment les imprimer, d’où le changement du titre et de l’étiquette.

En C standard, vous utilisez des caractères larges et des chaînes larges:

 #include  #include  #include  #include  int main(void) { setlocale(LC_ALL, ""); fwide(stdout, 1); wprintf(L"🞨🞩🞪🞫🞬🞭🞮 🞉🞈🞇🞆🞅\n"); wprintf(L" │ │ \n"); wprintf(L"───┼───┼───\n"); wprintf(L" │ │ \n"); wprintf(L"───┼───┼───\n"); wprintf(L" │ │ \n"); return EXIT_SUCCESS; } 

Vous pouvez utiliser des constantes de caractères larges telles que L'┼' ; leur spécificateur de conversion pour les fonctions printf() et wprintf() est %lc . De même, une constante chaîne large a un préfixe L et son spécificateur de conversion est %ls .

Malheureusement, vous êtes limité à la version mutilée de C fournie par Microsoft. Elle peut donc ne pas fonctionner pour vous.


Le code ci-dessus ne fonctionne pas sous Windows, car Microsoft ne le souhaite pas. Voir la documentation de Microsoft sur setlocale () pour plus de détails:

L’ensemble des noms de parameters régionaux, des langues, des codes de pays / région et des pages de codes disponibles comprend tous ceux pris en charge par l’API Windows NLS, à l’exception des pages de code nécessitant plus de deux octets par caractère, tels que UTF-7 et UTF-8.

En d’autres termes, la localisation C de Microsoft est limitée aux pages de codes d’un octet et exclut spécifiquement les parameters régionaux Unicode. Cela fait cependant partie de la stratégie de Microsoft EEE de vous lier, en tant que développeur en herbe, au propre jardin muré de Microsoft, de sorte que vous n’écriviez pas de code C portable (ou, horreur des horreurs, utilisez POSIX C), mais sont mentalement verrouillés au modèle Microsoft. Vous voyez, vous pouvez utiliser _setmode () pour activer la sortie Unicode.

Comme je n’utilise pas du tout Windows moi-même, je ne peux pas vérifier si les solutions de contournement suivantes, spécifiques à Windows, fonctionnent ou non, mais cela vaut la peine d’essayer. (Signalez vos découvertes dans un commentaire, utilisateurs Windows, s’il vous plaît, afin que je puisse corriger / inclure cette partie de cette réponse.)

 #include  #include  #include  #include  #ifdef _WIN32 #include  #include  static int set_wide_stream(FILE *stream) { return _setmode(_fileno(stream), _O_U16TEXT); } #else static int set_wide_stream(FILE *stream) { return fwide(stream, 1); } #endif int main(void) { setlocale(LC_ALL, ""); /* After this call, you must use wprintf(), fwprintf(), fputws(), putwc(), fputwc() -- ie only wide print/scan functions with this stream. You can print a narrow ssortingng using eg wprintf(L"%s\n", "Hello, world!"); */ set_wide_stream(stdout, 1); /* These may not work in Windows, because the code points are 0x1F785 .. 0x1F7AE and Windows is probably limited to Unicode 0x0000 .. 0xFFFF */ wprintf(L"🞨🞩🞪🞫🞬🞭🞮 🞉🞈🞇🞆🞅\n"); /* These are from the Box Drawing Unicode block, U+2500 ─, U+2502 │, and U+253C ┼, and should work everywhere. */ wprintf(L" │ │ \n"); wprintf(L"───┼───┼───\n"); wprintf(L" │ │ \n"); wprintf(L"───┼───┼───\n"); wprintf(L" │ │ \n"); return EXIT_SUCCESS; }