打印ascii表0-127

时间:2010-08-25 09:26:11

标签: c++ ascii

有一个关于从ascii表打印出128个第一个字符的问题。我还没有到目前为止,因为我已经偶然发现了一个问题。以下代码打印从32-127开始的正确值。从0到31但是它打印出一些废料值。我认为它也是正确的,因为我在asciitable.com上快速检查这些值代表ABC旁边的其他东西...... Z。

所以我的问题是如何在示例输出中打印出这些值?而且我想知道如何编写一个像示例输出一样打印出来的程序。由于我能想到的解决方案会给我输出,例如一行中有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很好地提供的功能。

5 个答案:

答案 0 :(得分: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";
    }
}

答案 1 :(得分:1)

这些字符没有ASCII标准化的图形表示,但有些字体/字符集确实提供了一种。例如,在旧的DOS系统(以及我甚至更老的基于Zilog Z-80的系统)上,您可以将值“戳”到视频内存中以查看相关字符。类似地,128-256有额外的图形用于绘制线条,框,阴影等。但是,只有那些你能够打印的图形才真正有意义的ASCII字符。如果你真的想要显示更多,那么你必须使你的程序与它正在交互的显示系统高度耦合 - 找到一些特殊的转义序列,它支持显示非标准字符,通过图形API写入,或返回对于年岁人的“戳入记忆”的方法......

要将输出分成列,可以在循环中添加一个额外的语句,以查看是否(i%num_columns == 0),然后写一个换行符'\ 0'。如果你想让列跳入值,使用i + = 16而不是i ++,然后将“if(i&gt; 0x70){i - = 0x6F; std :: cout&lt;&lt;'\ n';}”添加到移到新行的开头。

答案 2 :(得分:1)

32之前的字符是控制字符。例如,ascii 7是“bell”字符,13是换行符,依此类推。所以你必须找出如何打印它们。

至于按列而不是行打印,这里有一个提示:注意第一行包含ascii字符0,10,20,... 70;第二个有1,11,... 71。您应该能够找出模式并注意到您需要两个循环(外部和内部),其中内部循环打印属于外部循环给出的行的字符。

答案 3 :(得分:0)

检查gnu ascii程序。它做了类似的事情。

答案 4 :(得分:0)

某些字符无意显示;例如,7号,如果我没记错的话是“响铃”,发出哔哔声(因为打字机,你知道,当你完成你的线路时,它会发出哔哔声)。

我知道的最好的便携方式是设置条件而不是在0到31之间打印,或者在表格中存储这些字符的经典名称(BR,LF等,您可以在网上轻松找到它们)和显示那些而不是试图显示角色本身,因为根据定义它们是不可显示的。