2017-07-25 134 views
-2

我只是試圖打印一個充滿填充ASCII框的形狀到控制檯,但輸出只是垃圾文本。這裏是我的代碼:打印ASCII框不工作

#include <stdio.h> 

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

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

這裏是輸出:

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

圖片的代碼,如果它不能正常顯示。

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

我在C,CodeLite IDE,WINDOWS 10使用MinGW-32的工作。提前致謝。

+0

結果取決於控制檯使用的代碼頁。當您使用ANSI代碼頁時,通常的控制檯使用OEM代碼頁。您需要使用Unicode功能和文本以進行正確的打印 – RbMm

+0

請注意,您不應該使用''''''終止來創建長字符串 - 見證第二行和後續行中的空格。使用字符串連接:'「▒▒██████▒\ \ n」 「▒████████▒\ n」 「██████████\ n」 「▒█████████\ n」 「▒▒██████▒▒\ n」'也處理主要空白。這些字符串段之間只有空白(代碼中的換行符,我的註釋中的空白)。在C90之前,反斜線換行機制是必需的,但自此以後就沒有了。 –

+0

它可能不是任何安慰告訴你,代碼在運行macOS Sierra的Mac上可以正常工作。 –

回答

0

雖然RbMm和PeterJ的答覆工作,我用技巧從this 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; 

} 
0
  1. 如何使你的文本編輯器的代碼不可打印的字符是未知的,但我想這是UTF-東西,YOUT表包含完全不同的東西,你認爲

  2. 見怎麼辦ASCII> 127打印

    for(int i = 32; i < 256;i++) 
        printf("%3d/%02x = %c\n\r", i, i, i);` 
    

然後使用轉義序列定義表 - 例如

char a[] = "\xf3\xef" 

這裏有4列版本

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 =   
+0

你讀過我寫的嗎?這就是他在他的桌子上看到兩個人物的原因。他的桌子有着完全不同的內容,他認爲 –

+0

@ Ryan B在評論前閱讀。你不知道那裏發生了什麼。 –

+0

我進行了角色測試,出於某種原因,所有的東西都顯示爲相同的字符,比如'32/20 =╗','33/21 =╗','34/22 =╗' '255/ff =╗' – xaresys

0

Windows控制檯只使用的Unicode(UTF-16的編碼),在控制檯顯示文本。如果您使用Unicode將文本傳遞到控制檯,請通過WriteConsoleW進行說明 - 它將按原樣顯示。如果您使用ansi版本WriteConsoleA - 您的文本最初將通過調用MultiByteToWideChar轉換爲Unicode,並且將使用從GetConsoleOutputCP返回的第一個參數CodePage。默認情況下控制檯使用OEM代碼頁GetOEMCP。但是你使用ansi編碼(GetACP)。在打印之前,您可以撥打SetConsoleOutputCP。並且您將需要使用特定的硬編碼代碼頁值 - 完全相同,編譯時您的編譯器使用源字符串"▒▒██████▒▒"。當您在相同的窗口上運行編譯代碼時(,如果編譯器不提示警告C4566:由通用字符名稱代表的字符'\ uxxxx'不能在當前代碼頁(N))中顯示 - SetConsoleOutputCP(GetACP()) - 將會工作,但ANSI代碼頁可以在不同的計算機上有所不同 - 所以不適用於另一臺計算機。

這裏很好的解決方案 - 使用Unicode L"▒▒██████▒▒"字符串與WriteConsoleW或另一個W函數。如果在運行時得到字符串作爲多字節字符串 - 您需要打印之前或 調用SetConsoleOutputCP(cp)其中cp - 是您的字符串中使用的代碼頁,然後使用A函數輸出。 或(更好的)第一個自己的字符串轉換通過MultiByteToWideChar(cp, *)爲Unicode,然後用W功能輸出

+0

我把'shade_block'的類型改成了'wchar_t',在它之前加了L,並且使用了wprintf,現在它什麼都不打印。這是我的編譯器的問題嗎? – xaresys

+0

否請參閱我的回答。現在忘記unicode&w_char。 –

+0

@xaresys我使用'WriteConsoleW',它真的打印所有這些字符集 – RbMm