在我的 C++ 课程中遇到挑战问题。 目标是输出 0-127 之间的所有 ASCII 字符,每行 16 个字符。
我们遇到的问题是某些字符,例如 10 ( )正在做他们应该做的事情而不是显示“ ”。我的导师也不知道这个问题的解决办法。
这就是我所拥有的:
int main ()
{
for (int i = 0; i <= 127; i++) {
cout << setw(4) << i << ": " << (char)i << " ";
if ((i + 1) % 16 == 0) {
cout << endl;
// Not sure why this doesn't seem to be displaying correctly? Possibly it's because of what some of the earlier ascii characters do/are
}
}
return 0;
}
我们找到了一些可能的解决方案,包括 Raw,它似乎不适用于变量。 也没有设法让 fprint 为它工作
现代终端的工作方式与旧式 DOS 终端不同。您不能只将控制字符代码写入视频内存并使其字形出现在屏幕上。
相反,您必须将 Unicode 值写入显示屏。如果您使用 UTF-8,您可以让它在 Windows 和 *nixen 上都能很好地工作。
#include <iomanip>
#include <iostream>
#ifdef _WIN32
#include <windows.h>
struct OutputCodePage
{
UINT original_cp;
OutputCodePage( UINT cp ) : original_cp{GetConsoleOutputCP()} { SetConsoleOutputCP( cp ); }
~OutputCodePage() { SetConsoleOutputCP( original_cp ); }
};
OutputCodePage output_code_page( CP_UTF8 );
#endif
const char * CP437[] = // 0 (nul) --> 32 (space)
{
" ", "☺", "☻", "♥", "♦", "♣", "♠", "•", "◘", "○", "◙", "♂", "♀", "♪", "♫", "☼",
"►", "◄", "↕", "‼", "¶", "§", "▬", "↨", "↑", "↓", "→", "←", "∟", "↔", "▲", "▼",
" ", "!", "\"","#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?",
"@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
"P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\"","]", "^", "_",
"`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "⌂",
"Ç", "ü", "é", "â", "ä", "à", "å", "ç", "ê", "ë", "è", "ï", "î", "ì", "Ä", "Å",
"É", "æ", "Æ", "ô", "ö", "ò", "û", "ù", "ÿ", "Ö", "Ü", "¢", "£", "¥", "₧", "ƒ",
"á", "í", "ó", "ú", "ñ", "Ñ", "ª", "º", "¿", "⌐", "¬", "½", "¼", "¡", "«", "»",
"░", "▒", "▓", "│", "┤", "╡", "╢", "╖", "╕", "╣", "║", "╗", "╝", "╜", "╛", "┐",
"└", "┴", "┬", "├", "─", "┼", "╞", "╟", "╚", "╔", "╩", "╦", "╠", "═", "╬", "╧",
"╨", "╤", "╥", "╙", "╘", "╒", "╓", "╫", "╪", "┘", "┌", "█", "▄", "▌", "▐", "▀",
"α", "ß", "Γ", "π", "Σ", "σ", "µ", "τ", "Φ", "Θ", "Ω", "δ", "∞", "φ", "ε", "∩",
"≡", "±", "≥", "≤", "⌠", "⌡", "÷", "≈", "°", "∙", "·", "√", "ⁿ", "²", "■", "\xA0"
};
int main()
{
std::cout << " + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n";
for (int y = 0; y < 16; y++)
{
std::cout << std::setw(3) << (y * 16);
for (int x = 0; x < 16; x++)
{
std::cout << " " << CP437[y * 16 + x];
}
std::cout << "\n";
}
}
这会让你:
+ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 ☺ ☻ ♥ ♦ ♣ ♠ • ◘ ○ ◙ ♂ ♀ ♪ ♫ ☼
16 ► ◄ ↕ ‼ ¶ § ▬ ↨ ↑ ↓ → ← ∟ ↔ ▲ ▼
32 ! " # $ % & ' ( ) * + , - . /
48 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
64 @ A B C D E F G H I J K L M N O
80 P Q R S T U V W X Y Z [ " ] ^ _
96 ` a b c d e f g h i j k l m n o
112 p q r s t u v w x y z { | } ~ ⌂
128 Ç ü é â ä à å ç ê ë è ï î ì Ä Å
144 É æ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥ ₧ ƒ
160 á í ó ú ñ Ñ ª º ¿ ⌐ ¬ ½ ¼ ¡ « »
176 ░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐
192 └ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧
208 ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀
224 α ß Γ π Σ σ µ τ Φ Θ Ω δ ∞ φ ε ∩
240 ≡ ± ≥ ≤ ⌠ ⌡ ÷ ≈ ° ∙ · √ ⁿ ² ■ �
请记住,从 0..31(以及 126 之后的内容)开始的所有内容不一定是单个字符。在 UTF-8 中,每个“字符”都是一个string。这就是源代码中使用双引号的原因。
附注正如您所看到的,这是代码页 437 — 类似 DOS 终端显示的旧标准。如果您希望显示其他代码页的值,则必须调整字符串数组。
P.P.S。如果您只想将
int
显示为 char
,那么您必须坚持使用可显示字符:32..126.
std::cout << (char)65 << ...; // prints “A“