2010-08-25 119 views
2

從ascii表中打印出128個第一個字符的問題。我還沒有得到,因爲我已經偶然發現了一個問題。以下代碼打印從32-127開始的正確值。然而,從0到31,它會打印出一些廢料值。我認爲這是正確的,因爲我快速檢查asciitable.com這些值代表ABC旁邊的其他東西... Z。打印ascii表0-127

所以我的問題是我如何可以打印出這些值,如在示例輸出?而且我想知道如何編寫一個打印出來的程序,就像輸出結果一樣。由於我能想到的解決方案會給我輸出例如1到10個字符而不是列。

int main() 
{ 
    int i =0; 
    for(int rows = 0; rows < 16; rows++) 
    { 
     i = rows; 
     while(i <= 127) 
     { 
      if(i <= 15) 
       cout << hex << setw(2) << setfill('0') << i << "= " << setw(2) << setfill(' ') << toStr(i) << " | "; 
      else 
       cout << hex << setw(2) << setfill('0') << i << "= " << setw(2) << setfill(' ') << char(i) << " | "; 
      i+=16; 
     } 

     cout << "\n"; 
    } 

    return 0; 
} 

示例輸出

+--------+--------+--------+--------+--------+--------+--------+--------+ 
| 00  | 10  | 20 ' ' | 30 '0' | 40 '@' | 50 'P' | 60 '`' | 70 'p' | 
| 01  | 11  | 21 '!' | 31 '1' | 41 'A' | 51 'Q' | 61 'a' | 71 'q' | 
| 02  | 12  | 22 '"' | 32 '2' | 42 'B' | 52 'R' | 62 'b' | 72 'r' | 
| 03  | 13  | 23 '#' | 33 '3' | 43 'C' | 53 'S' | 63 'c' | 73 's' | 
| 04  | 14  | 24 '$' | 34 '4' | 44 'D' | 54 'T' | 64 'd' | 74 't' | 
| 05  | 15  | 25 '%' | 35 '5' | 45 'E' | 55 'U' | 65 'e' | 75 'u' | 
| 06  | 16  | 26 '&' | 36 '6' | 46 'F' | 56 'V' | 66 'f' | 76 'v' | 
| 07'\a' | 17  | 27 ''' | 37 '7' | 47 'G' | 57 'W' | 67 'g' | 77 'w' | 
| 08'\b' | 18  | 28 '(' | 38 '8' | 48 'H' | 58 'X' | 68 'h' | 78 'x' | 
| 09'\t' | 19  | 29 ')' | 39 '9' | 49 'I' | 59 'Y' | 69 'i' | 79 'y' | 
| 0a'\n' | 1a  | 2a '*' | 3a ':' | 4a 'J' | 5a 'Z' | 6a 'j' | 7a 'z' | 
| 0b'\v' | 1b  | 2b '+' | 3b ';' | 4b 'K' | 5b '[' | 6b 'k' | 7b '{' | 
| 0c'\f' | 1c  | 2c ',' | 3c '<' | 4c 'L' | 5c'\\' | 6c 'l' | 7c '|' | 
| 0d'\r' | 1d  | 2d '-' | 3d '=' | 4d 'M' | 5d ']' | 6d 'm' | 7d '}' | 
| 0e  | 1e  | 2e '.' | 3e '>' | 4e 'N' | 5e '^' | 6e 'n' | 7e '~' | 
| 0f  | 1f  | 2f '/' | 3f '?' | 4f 'O' | 5f '_' | 6f 'o' | 7f  | 
+--------+--------+--------+--------+--------+--------+--------+--------+ 

編輯 我得到了一個相當確定的解決方案,現在我想,編輯的代碼。除了理解如何在列中打印外,我還使用了Martin很好地提供的功能。

回答

3

如果字符小於32,它是一個特殊字符,因此可能沒有可變的字形。所以如果字符低於32你應該考慮到這一點,並在其位置放置一個適當的字符串。

#include <iostream> 

// An array of strings for all the special characters. 
char const* data[] = {"", "", "", "", "", "", "", "" 
         "\\a","\\b","\\t","\\n","\\v","\\f","\\r" 
         // etc 
        }; 

char const* toStr(int loop) 
{ 
    // Used by normal character. 
    // Note buffer[0] is where we put the char. buffer[1] is always '\0' 
    static char buffer[] = " "; 

    if (loop < 32) 
    { 
     return data[loop]; 
    } 
    else 
    { 
     buffer[0] = loop; 
     return buffer; 
    } 
} 

int main() 
{ 
    for(int loop =0;loop < 128;++loop) 
    { 
     std::cout << loop << "=" << toStr(loop) << "\n"; 
    } 
} 
+2

我認爲你的意思是'不可打印的'字符。 – Chubsdad 2010-08-25 09:46:16

0

檢查gnu ascii程序。它做了類似的事情。

+0

小心分享鏈接?還是這一個http://www.gnu.org/graphics/gnu-ascii.html – starcorn 2010-08-25 09:35:43

+0

恐怕我找不到它......要麼隱藏在某個地方。 – 2010-08-25 11:17:58

1

這些字符沒有ASCII標準化的圖形表示,儘管一些字體/字符集確實提供了一個。例如,在舊的DOS系統(以及我的Zilog Z-80的舊系統)上,您可以將這些值「戳」到視頻內存中以查看關聯的字符。同樣,128-256有額外的圖形用於繪製線條,框,做陰影等。但是,只有那些你已經能夠打印的字符纔是真正有意義的ASCII字符。如果你真的想顯示更多,那麼你必須讓你的程序高度耦合到它正在與之交互的顯示系統 - 尋找它支持的一些特殊的轉義序列,用於顯示非標準字符,通過圖形API寫入,或返回到去年的「捅入記憶」的方法......

爲了將輸出分成列,你可以在循環中添加一個額外的語句來查看是否(i%num_columns == 0),然後寫一個換行符'\ 0'。如果你想要列跳轉的值,使用i + = 16而不是i ++,然後把「if(i> 0x70){i - = 0x6F; std :: cout < <'\ n';}」移動到新行的開始。

0

有些字符不是要顯示;例如,如果我沒有記錯的話,第七名是「響鈴」,它會發出嗶嗶聲(因爲打字機,你知道,當你完成你的線路時,它會發出嗶嗶聲)。

我知道的最好的便攜方式是在0到31之間放置一個條件而不打印,或者在表格中儲存這些字符的經典名稱(BR,LF等,您可以在網上輕鬆找到它們)並顯示它們而不是嘗試顯示字符本身,因爲這些字符在定義上是不可顯示的。

1

32之前的字符是控制字符。例如,ascii 7是「鈴」字符,13是換行符等等。所以你必須找出如何打印它們。

至於按列而不是行來打印,這裏有一個提示:請注意,第一行包含ascii字符0,10,20,... 70;第二個有1,11,... 71。你應該能夠弄清楚這個模式,並且注意到你需要兩個循環(一個外部循環和一個內部循環),其中內部循環打印屬於由外部循環給出的行的字符。

+0

我不明白打印出第一列後人們如何跳回到開頭。或者我應該用行來打印所有東西,例如在第一次運行中,我打印出00,10,20 ... 70?我更新了我的代碼。 – starcorn 2010-08-25 10:07:13

+0

nvm我現在想到了 – starcorn 2010-08-25 10:42:12

+0

有一個原因,我沒有詳細說明,我猜你認爲:) – 2010-08-25 12:15:41