Распечатать таблицу ASCII 0-127 - PullRequest
2 голосов
/ 25 августа 2010

возник вопрос относительно распечатки 128 первых символов из таблицы ascii. Я еще не дошел, потому что я уже наткнулся на проблему. Следующий код печатает правильное значение, начиная с 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     |
+--------+--------+--------+--------+--------+--------+--------+--------+

EDIT Я думаю, что я получил вполне нормальное решение, отредактировал код. Помимо понимания того, как печатать в столбцах, я также использовал функцию, которую Мартин прекрасно предоставил.

Ответы [ 5 ]

3 голосов
/ 25 августа 2010

Если символ меньше 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 голос
/ 25 августа 2010

Символы до 32 являются управляющими символами. Например, ascii 7 - это символ "колокольчик", 13 - перевод строки и так далее. Таким образом, вы должны узнать, как их распечатать.

Что касается печати по столбцам, а не по строкам, вот подсказка: обратите внимание, что первая строка содержит символы ascii 0, 10, 20, ... 70; второй имеет 1, 11, ... 71. Вы должны быть в состоянии выяснить схему и заметить, что вам нужны два цикла (внешний и внутренний), где внутренний цикл печатает символы, принадлежащие строке, заданной внешним циклом.

1 голос
/ 25 августа 2010

Эти символы не имеют стандартизированного ASCII графического представления, хотя некоторые шрифты / наборы символов предоставляют его. Например, в старых системах DOS (и в моей даже более старой системе на базе Zilog Z-80) вы могли «вставить» значения в видеопамять, чтобы увидеть связанные символы. Точно так же 128-256 имели дополнительную графику, используемую для рисования линий, прямоугольников, заливки и т. Д. Но только те символы, которые вы смогли напечатать, действительно значимы как символы ASCII. Если вы действительно хотите отображать больше, вы должны сделать свою программу сильно связанной с системой отображения, с которой она взаимодействует - найти некоторые специальные escape-последовательности, которые она поддерживает для отображения нестандартных символов, писать через графический API или вернуться назад. к подходу «тыкать в память» прошлого года ....

Чтобы разбить вывод на столбцы, вы можете добавить в свой цикл дополнительный оператор, чтобы увидеть, если (i% num_columns == 0), а затем написать символ новой строки '\ 0'. Если вы хотите, чтобы столбцы переходили в значение, используйте i + = 16 вместо i ++, а затем вставьте «if (i> 0x70) {i - = 0x6F; std :: cout << '\ n';}», чтобы перейти к начало нового ряда. </p>

0 голосов
/ 25 августа 2010

Некоторые символы не предназначены для отображения;например, 7-й, если я правильно помню, это «звонок», который издает звуковой сигнал (из-за пишущих машинок, вы знаете, когда вы закончите свою линию, он издает звуковой сигнал).

Лучший портативный способ, который я знаю, - это поставить условие, а не печатать от 0 до 31, или поместить в таблицу классические названия этих символов (BR, LF и т. Д., Их легко найти навеб) и отображать их вместо того, чтобы пытаться отобразить сам символ, поскольку по определению они не отображаются.

0 голосов
/ 25 августа 2010

Проверьте программу gnu ascii.Это делает нечто подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...