打印ASCII框不工作

打印ASCII框不工作,c,windows,ascii,mingw32,C,Windows,Ascii,Mingw32,我只是想在控制台中打印一个填充了ASCII框的形状,但输出的只是垃圾文本。这是我的密码: #include <stdio.h> const char shade_block[] = { "▒▒██████▒▒\n\ ▒████████▒\n\ ██████████\n\ ▒████████▒\n\ ▒▒██████▒▒\n\ "}; int main() { printf(shade_block); retu

我只是想在控制台中打印一个填充了ASCII框的形状,但输出的只是垃圾文本。这是我的密码:

#include <stdio.h>

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

int main()
{
    printf(shade_block);
    return 0;
}
代码的图片(如果显示不正确)

我在C、CodeLiteIDE、Windows10和MinGW-32中工作。提前谢谢

  • 您的文本编辑器是如何编码不可打印字符的还不得而知,但我想这是UTF的问题,而yout表包含了您认为完全不同的内容

  • 请参见ascii>127如何打印

    for(int i = 32; i < 256;i++)
        printf("%3d / %02x = %c\n\r", i, i, i);`
    
    这里你有4列版本

    for (int i = 32; i < 256; i++)
        printf("%3d / %02x = %c%s", i, i, i, ((i >> 2) << 2 == i) ? "\n\r" : "\t");
    
    for(int i=32;i<256;i++)
    
    printf(“%3d/%02x=%c%s”,i,i,i,((i>>2)windows控制台仅使用Unicode(UTF-16编码)用于在控制台中显示文本。如果您以Unicode向控制台传递文本,比如说通过
    WriteConsoleW
    ,它将按原样显示。如果您使用ansi版本
    WriteConsoleA
    ,您的文本最初将通过调用转换为Unicode,并且作为第一个参数
    CodePage
    将使用从控制台返回的值。默认情况下,将使用控制台OEM代码页。但是您使用ansi编码()。您可以在ansi中打印之前调用。并且您需要使用特定的硬编码代码页值-与编译器在编译源字符串时使用的值完全相同。
    “▒▒██████▒▒"。在编译代码的同一个窗口上运行时(如果编译器未向您发出警告C4566:通用字符名“\uxxx”表示的字符不能在当前代码页中表示(N))-
    SetConsoleOutputCP(GetACP())
    -将工作,但不同计算机上的ANSI代码页可能不同-因此不能在其他计算机上工作

    所以这里有一个很好的解决方案-使用Unicode
    L“▒▒██████▒▒“
    具有
    WriteConsoleW
    或其他
    W
    函数的字符串。如果您在运行时将字符串设置为多字节字符串,则需要在打印或 调用
    SetConsoleOutputCP(cp)
    其中cp-是字符串中使用的代码页,然后使用
    A
    函数进行输出。
    或者(更好)先通过
    MultiByteToWideChar(cp,*)
    将字符串转换为Unicode,然后使用
    W
    函数进行输出

    尽管RbMm和PeterJ的答案有效,但我使用了StackOVerflow问题中的提示,最终找到了如何在不进行任何字符转义或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;
    
    }
    
    #包括
    #包含//用于wprintf和宽字符
    #包括//For _setmode
    #为文本块定义U_16 0x20000//U-16文本模式
    康斯特西哈拉遮荫街区[]={
    L“▒▒██████▒▒\n“
    "▒████████▒\n“
    "██████████\n“
    "▒████████▒\n“
    "▒▒██████▒▒\n“
    };
    int main()
    {
    _setmode(_fileno(stdout),U_16);//将输出模式设置为U_16
    wprintf(L“%s\n”,阴影块);
    返回0;
    }
    
    结果取决于控制台使用的代码页。当您使用ANSI代码页时,通常控制台使用OEM代码页。您需要使用Unicode函数和文本进行正确打印注意,您不应使用
    \
    终止来创建长字符串-查看第二行和后续行上的空格。使用字符串连接:
    “▒▒██████▒▒\n“▒████████▒\n“██████████\n“▒████████▒\n“▒▒██████▒▒\n“
    也处理前导空格。只有空格(代码中的换行,我的注释中的空格)在字符串段之间。反斜杠换行机制在C90之前是必要的,但从那时起就没有了。告诉你代码在运行macOS Sierra的Mac上运行正常可能不是什么安慰。你读过我写的吗?这就是他在表中看到一个字符对应两个字符的原因。他的表中有完全不同的内容,他没有看到hinks@Ryan B在评论之前阅读。你不知道那里发生了什么。我运行了角色测试,出于某种原因,所有内容都显示为同一个角色…例如
    32/20=╗
    33/21=╗
    34/22=╗一直到
    255/ff=╗忘记了另一个我在我的printfI中更改了
    shade_block
    的类型为
    wchar_t
    ,在它前面添加了L,并使用了wprintf,现在它什么也不打印。这是我的编译器的问题吗?不。请看我的答案。暂时忘记unicode和w_char。@xaresys我使用
    WriteConsoleW
    ,它真的打印了所有这些charasters@Peter为什么我需要忘记unicode?unicode是windows的本机代码,unicode非常完美working@RbMm-冷静下来,给那家伙一个机会,让他第一次“你好,世界”“应用程序。我知道你知道怎么做,但这会让他的大脑一团糟。给他一个机会去理解字符串、指针等。我希望你知道我的意思。”
    for (int i = 32; i < 256; i++)
        printf("%3d / %02x = %c%s", i, i, i, ((i >> 2) << 2 == i) ? "\n\r" : "\t");
    
     32 / 20 =
     33 / 21 = !     34 / 22 = "     35 / 23 = #     36 / 24 = $
     37 / 25 = %     38 / 26 = &     39 / 27 = '     40 / 28 = (
     41 / 29 = )     42 / 2a = *     43 / 2b = +     44 / 2c = ,
     45 / 2d = -     46 / 2e = .     47 / 2f = /     48 / 30 = 0
     49 / 31 = 1     50 / 32 = 2     51 / 33 = 3     52 / 34 = 4
     53 / 35 = 5     54 / 36 = 6     55 / 37 = 7     56 / 38 = 8
     57 / 39 = 9     58 / 3a = :     59 / 3b = ;     60 / 3c = <
     61 / 3d = =     62 / 3e = >     63 / 3f = ?     64 / 40 = @
     65 / 41 = A     66 / 42 = B     67 / 43 = C     68 / 44 = D
     69 / 45 = E     70 / 46 = F     71 / 47 = G     72 / 48 = H
     73 / 49 = I     74 / 4a = J     75 / 4b = K     76 / 4c = L
     77 / 4d = M     78 / 4e = N     79 / 4f = O     80 / 50 = P
     81 / 51 = Q     82 / 52 = R     83 / 53 = S     84 / 54 = T
     85 / 55 = U     86 / 56 = V     87 / 57 = W     88 / 58 = X
     89 / 59 = Y     90 / 5a = Z     91 / 5b = [     92 / 5c = \
     93 / 5d = ]     94 / 5e = ^     95 / 5f = _     96 / 60 = `
     97 / 61 = a     98 / 62 = b     99 / 63 = c    100 / 64 = d
    101 / 65 = e    102 / 66 = f    103 / 67 = g    104 / 68 = h
    105 / 69 = i    106 / 6a = j    107 / 6b = k    108 / 6c = l
    109 / 6d = m    110 / 6e = n    111 / 6f = o    112 / 70 = p
    113 / 71 = q    114 / 72 = r    115 / 73 = s    116 / 74 = t
    117 / 75 = u    118 / 76 = v    119 / 77 = w    120 / 78 = x
    121 / 79 = y    122 / 7a = z    123 / 7b = {    124 / 7c = |
    125 / 7d = }    126 / 7e = ~    127 / 7f =     128 / 80 = Ç
    129 / 81 = ü    130 / 82 = é    131 / 83 = â    132 / 84 = ä
    133 / 85 = à    134 / 86 = å    135 / 87 = ç    136 / 88 = ê
    137 / 89 = ë    138 / 8a = è    139 / 8b = ï    140 / 8c = î
    141 / 8d = ì    142 / 8e = Ä    143 / 8f = Å    144 / 90 = É
    145 / 91 = æ    146 / 92 = Æ    147 / 93 = ô    148 / 94 = ö
    149 / 95 = ò    150 / 96 = û    151 / 97 = ù    152 / 98 = ÿ
    153 / 99 = Ö    154 / 9a = Ü    155 / 9b = ø    156 / 9c = £
    157 / 9d = Ø    158 / 9e = ×    159 / 9f = ƒ    160 / a0 = á
    161 / a1 = í    162 / a2 = ó    163 / a3 = ú    164 / a4 = ñ
    165 / a5 = Ñ    166 / a6 = ª    167 / a7 = º    168 / a8 = ¿
    169 / a9 = ®    170 / aa = ¬    171 / ab = ½    172 / ac = ¼
    173 / ad = ¡    174 / ae = «    175 / af = »    176 / b0 = ░
    177 / b1 = ▒    178 / b2 = ▓    179 / b3 = │    180 / b4 = ┤
    181 / b5 = Á    182 / b6 = Â    183 / b7 = À    184 / b8 = ©
    185 / b9 = ╣    186 / ba = ║    187 / bb = ╗    188 / bc = ╝
    189 / bd = ¢    190 / be = ¥    191 / bf = ┐    192 / c0 = └
    193 / c1 = ┴    194 / c2 = ┬    195 / c3 = ├    196 / c4 = ─
    197 / c5 = ┼    198 / c6 = ã    199 / c7 = Ã    200 / c8 = ╚
    201 / c9 = ╔    202 / ca = ╩    203 / cb = ╦    204 / cc = ╠
    205 / cd = ═    206 / ce = ╬    207 / cf = ¤    208 / d0 = ð
    209 / d1 = Ð    210 / d2 = Ê    211 / d3 = Ë    212 / d4 = È
    213 / d5 = ı    214 / d6 = Í    215 / d7 = Î    216 / d8 = Ï
    217 / d9 = ┘    218 / da = ┌    219 / db = █    220 / dc = ▄
    221 / dd = ¦    222 / de = Ì    223 / df = ▀    224 / e0 = Ó
    225 / e1 = ß    226 / e2 = Ô    227 / e3 = Ò    228 / e4 = õ
    229 / e5 = Õ    230 / e6 = µ    231 / e7 = þ    232 / e8 = Þ
    233 / e9 = Ú    234 / ea = Û    235 / eb = Ù    236 / ec = ý
    237 / ed = Ý    238 / ee = ¯    239 / ef = ´    240 / f0 = ­
    241 / f1 = ±    242 / f2 = ‗    243 / f3 = ¾    244 / f4 = ¶
    245 / f5 = §    246 / f6 = ÷    247 / f7 = ¸    248 / f8 = °
    249 / f9 = ¨    250 / fa = ·    251 / fb = ¹    252 / fc = ³
    253 / fd = ²    254 / fe = ■    255 / ff =  
    
    #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;
    
    }