2010-08-25 67 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