J'essaie juste d'imprimer une forme remplie de boîtes ASCII remplies dans la console, mais la sortie est juste du texte de poubelle. Voici mon code:

#include <stdio.h>

const char shade_block[] = {
    "▒▒██████▒▒\n\
     ▒████████▒\n\
     ██████████\n\
     ▒████████▒\n\
     ▒▒██████▒▒\n\
    "};

int main()
{
    printf(shade_block);
    return 0;
}

Et voici la sortie:

ΓûÆΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûÆΓûÆ
         ΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûÆ
         ΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûê
         ΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûêΓûÆ
         ΓûÆΓûÆΓûêΓûêΓûêΓûêΓûêΓûêΓûÆΓûÆ

Image du code, s'il ne s'affiche pas correctement.

Picture of the code, if it's not displaying properly.

Je travaille en C, CodeLite IDE, WIndows 10 avec MinGW-32. Merci d'avance.

-1
xaresys 26 juil. 2017 à 02:39

2 réponses

Meilleure réponse

Bien que les réponses de RbMm et PeterJ aient fonctionné, j'ai utilisé des conseils de cette question StackOVerflow et finalement compris comment imprimer le bloc tel quel sans échappement de caractère ni WriteConsoleW:

#include <stdio.h>
#include <wchar.h>              //For wprintf and wide chars
#include <io.h>                 //For _setmode
#define U_16 0x20000            //U-16 text mode, for the text blocks

const wchar_t shade_block[] = {
    L"▒▒██████▒▒\n"
    "▒████████▒\n"
    "██████████\n"
    "▒████████▒\n"
    "▒▒██████▒▒\n"
    };

int main()
{
    _setmode(_fileno(stdout), U_16); //set the output mode to U_16
    wprintf(L"%s\n", shade_block);

    return 0;

}
0
xaresys 26 juil. 2017 à 16:37

La console Windows n'utilisait que Unicode (encodage UTF-16) pour afficher le texte dans la console. si vous passez du texte à la console en Unicode, dites via WriteConsoleW - il sera affiché tel quel. si vous utilisez la version ansi WriteConsoleA - votre texte sera initialement converti en Unicode par appel MultiByteToWideChar et comme premier paramètre CodePage sera la valeur utilisée renvoyée par GetConsoleOutputCP. par défaut, la console a utilisé la page de codes OEM GetOEMCP. cependant vous utilisez l'encodage ansi ({ {X6}}). vous pouvez appeler SetConsoleOutputCP avant d'imprimer dans ansi. et vous aurez besoin d'utiliser une valeur de page de code spécifique, codée en dur - exactement la même que celle utilisée par votre compilateur lors de la compilation de votre chaîne source "▒▒██████▒▒". lorsque vous exécutez sur les mêmes fenêtres, où vous compilez du code ( et si le compilateur ne vous donne pas d'avertissement C4566: le caractère représenté par le nom-caractère-universel '\ uxxxx' ne peut pas être représenté dans la page de codes actuelle (N) ) - le SetConsoleOutputCP(GetACP()) - fonctionnera, mais les pages de codes ANSI peuvent être différentes sur différents ordinateurs - donc ne pas fonctionner sur un autre.

Si bonne solution ici - utilisez des chaînes Unicode L"▒▒██████▒▒" avec WriteConsoleW ou une autre fonction W. si vous avez une chaîne à l'exécution sous forme de chaînes multi-octets - vous en avez besoin avant de l'imprimer ou appelez SetConsoleOutputCP(cp) où cp - est la page de code utilisée dans votre chaîne, puis utilisez la fonction A pour la sortie. ou (mieux) convertissez d'abord vous-même la chaîne en Unicode via MultiByteToWideChar(cp, *), puis utilisez les fonctions W pour la sortie

0
RbMm 26 juil. 2017 à 08:00