【问题标题】:In C++, how to print ASCII art to the console?在 C++ 中,如何将 ASCII 艺术打印到控制台?
【发布时间】:2011-01-11 23:43:40
【问题描述】:

假设您想打印出其中一张出色的 ASCII 艺术图像。如果没有cout 每一行,你怎么能做到这一点?

【问题讨论】:

标签: c++ command-line-interface ascii-art


【解决方案1】:

相邻的字符串文字被连接起来,所以你可以这样做:

cout << " _______________________ _______ _          _______         _______ _______  _______ _       _______         \n"
        "(  ____ \__   __/  ___  )  ____ \ \    /\  (  ___  )\     /|  ____ \  ____ )(  ____ \ \     (  ___  )\     /|\n"
        "| (    \/  ) (  | (   ) | (    \/  \  / /  | (   ) | )   ( | (    \/ (    )|| (    \/ (     | (   ) | )   ( |\n"
        "| (_____   | |  | (___) | |     |  (_/ /   | |   | | |   | | (__   | (____)|| (__   | |     | |   | | | _ | |\n"
        "(_____  )  | |  |  ___  | |     |   _ (    | |   | | (   ) )  __)  |     __)|  __)  | |     | |   | | |( )| |\n"
        "      ) |  | |  | (   ) | |     |  ( \ \   | |   | |\ \_/ /| (     | (\ (   | (     | |     | |   | | || || |\n"
        "/\____) |  | |  | )   ( | (____/\  /  \ \  | (___) | \   / | (____/\ ) \ \__| )     | (____/\ (___) | () () |\n"
        "\_______)  )_(  |/     \|_______/_/    \/  (_______)  \_/  (_______//   \__/|/      (_______/_______)_______)\n";

或者,更准确地说,也许是:

cout << "                              .::/-                                                                                                                                                             \n"
        "                              .+++/                                                                                                                                                             \n"
        "                   `.::`       /+++.                                                                                                                                                            \n"
        "                  -////.      :+++-                                                                                                                                                             \n"
        "                    .////-`    .+++/`                                                                                                                                                           \n"
        "                    `:///:`   `/++/.                                                                                                                                                            \n"
        "            ..`        -////.   -+++:                                                                                                                                                           \n"
        "           :+++:-`      .////:` ./++/`                                                                                                                                                          \n"
        "          `-/+++++/-.    `:////.`:++/.                                                                                                                                                          \n"
        "             `.:/++++/:.`  -////..:--`                                                                                                                                                          \n"
        "                 .-/+++++/-..::.`                                                                                                                                                               \n"
        "       `:::-..``    `.:/++++-                                                                                                                                                                   \n"
        "       -++++++///:--.```.-/-                                                                                                                                                                    \n"
        "        `.--:///++++++//::.                                                                                                                                                                     \n"
        "`--.          ``..-::///+/``---                                                 -+-                                                             ./oso- /++:                                     \n"
        "-oo+  -::::----....````... `ooo                  :s-                            /mo                                                            -dmmhy:`hmmo                                     \n"
        "-oo+  /+++++++++++++++++/. `ooo                  om:                            /mo             ````     ```      ```    ``.``      ```  `.``  ommd`` `hmmo       ``.``    ```     ```     ```  \n"
        "-oo+  ...----::::////+++/` `ooo      `/ssyss+:`.ohmyoo` .+ssyss+-     -+syys+-  /mo    -o+.  .ohdmmdho- -hdd/   `sdds` :shmmmdy/`  .hddshdmmhoydmmmhy:`hmmo    .+hdmmmds- .ddd/   .ddh-   +ddh. \n"
        "-oo+  ```````````````````  `ooo     .yh-.``-/-  .sm/.` `/o-```-sd+  .sd+-..-++` /mo  .odo.  :dmmy+/smmm: +mmh-  /mmd- +mmh+:/smmy- .dmmdo/+s:`/ymmm++.`hmmo   .dmmh++smmd+`ommd` `ymmmy  .hmm+  \n"
        "-oo+  +oooooooooooooooooo- `ooo     -dy.         om:           -dy` +m/         /mo`+dy-   `smmy`  `smmy``smms`.hmm/ -dmd+---:hmmo`.dmm+       ommd   `hmmo   ommh.   ommh..ymm+ +mmdmm/ ommy.  \n"
        "-oo+  /++++++++++++++++++. `ooo      -oyhyyys/`  om:   `:osyyyyymy``sm-         /myhyhd:   `smms    +mmh` `dmm/smms  :dmmddddddddo`.dmm/       ommd   `hmmo   smmy`   /mmd. :dmd+dmy-ymd+hmd:   \n"
        "-oo+                       `ooo          ``.+do  om:   /do.    -dy``om:         /md/``od+` `ommh.  `ymmy`  :dmmmmy.  .hmd/`````.`  .dmm/       ommd    hmmo   +mmh-   smmy` `smmmmm- :dmmmmo    \n"
        "-oo+:::::::::::::::::::::::/ooo     -+:.```.od+  +mo.` /do.```.omy` .sd/.``.//` /mo    +dy. -ymmdysdmmh-    +mmmh-    :dmmyoosdd+` .dmm/       ommd    ommmso.`ymmdyshmmh:   .hmmm+   +mmmd`    \n"
        "-oooooooooooooooooooooooooooooo     ./syyyyyo:`  `:sys.`:syyyys+yo`  `:syyyyo:` :h/     :ys` `:shddhs/`     `ohy/      ./shddhy+-  .shh:       /hhy    `:syhs. `:oyhdhs/.     /hho`   `shh/     \n"

更明智的是,使用endl。这与每行后面的“\n”略有不同,因为您还将刷新输出流。

【讨论】:

  • 这是“史诗”字体,来自 patorjk.com 的生成器。
  • 这些示例将不起作用,因为它们充满了转义序列。任何你看到的“\”都是转义序列的开始,并且根本不会显示在控制台上。编译它,实际上你会收到关于它们的警告。我试图弄清楚这仍然是如何被选为最佳答案的。
  • 这些例子给warning: unknown escape sequence: '\_' 玩字体并没有为答案添加任何有用的东西。
【解决方案2】:

尝试类似:

cout << R"(place multiple lines
           of text here
           and it will display exactly
           as you have it between the two brackets,
           line feeds and all.)";

...上面的代码还允许您使用反斜杠 \ 等字符,而无需其中两个,它显示所有内容并且不识别控制代码,如 \n 等。非常方便。

这称为“字符串文字”,是在 C++11 中添加的。您可以在此处找到有关命令的更多信息,具体参考用于 raw_characters 的前缀“R”:https://en.cppreference.com/w/cpp/language/string_literal

【讨论】:

  • 这是在特定版本中添加的吗?
  • 我真的不记得了。几年前我在 Visual Studio 中使用过它,它运行良好,所以你应该没有问题。
  • 碰巧知道您使用的是哪个版本的 C++?我询问所有 v11 C++ 项目,如果它被添加到 2011 后的版本之一中,他们可能无法使用它。据我所知,它看起来像是 C11/C99 的添加,但无法验证。
  • 我又做了一些搜索,终于找到了。它被称为“字符串文字”,它是在 C++11 中添加的。这是一个页面,描述了您可以使用的更多详细信息。 en.cppreference.com/w/cpp/language/string_literal
  • @NeilRoy 更具体地说,它是一个“原始字符串文字”。将其简单地称为“字符串文字”会令人困惑,因为"foobar" 也是“字符串文字”。
【解决方案3】:

其他人已经建议使用endl。虽然这不是(必然)坏事,但使用endl 会刷新流的缓冲区并写入换行符。与您得到的答案之一相反,使用 endl 确实 not 有助于将换行符转换为平台通常用来表示结束的任何字符序列的一条线。使用newline 保证与stream &lt;&lt; "\n" &lt;&lt; flush;" 完全相同。将换行符转换为“\r”、“\n”或“\r\n”,或平台喜欢的任何内容,都是在不同的级别完成的,newline 与此无关。

不过,flush 会(而且经常会)减慢您的 I/O 速度,有时还会有相当大的幅度。只要你只写几行(例如几百个字符),它可能完全无关紧要。但是,如果您正在编写一个大文件,使用 endl 而不是 "\n" 很容易导致 10 倍的减速(事实上,我什至可以说 iostreams 是慢茎的大部分想法直接使用endl)。

这并不是说没有任何理由使用 endl。 flush 确保写入流的任何内容都会立即从标准库的缓冲区中清除,并发送到操作系统。如果您想确保立即显示,endl 可能很有用。同样,如果您正在记录日志,并且您的日志始终反映程序的最新已知状态至关重要,endl 可以(非常)有用地确保您所写的内容真正被记录,而不是丢失当/如果应用程序崩溃时的缓冲区。

所以,endl 有时是有道理的,但在使用它的 95% 的时间里,它确实是不合适的(例如,它不太可能在这个问题的任何答案中完成任何有用的事情)。

【讨论】:

    【解决方案4】:

    谢天谢地,这很简单。每当您想开始另一行时,只需使用 endl。

    cout << stuff << endl
         << morestuff << endl
         << evenmorestuff << endl;
    

    我想说我更喜欢使用 endl,因为即使您在需要“\r\n”而不仅仅是“\n”的平台上它也应该可以工作。

    【讨论】:

    • 虽然是一个显而易见的答案,但如果频繁使用这种方式打印多行可能会成为 CPU 的负担。重载运算符
    • 是的,这样做可能会成为负担,但如果他所做的只是打印一点 ascii 艺术,那应该不是问题。另一种方法是将它们全部打包成一根大绳子并立即将它们全部推出。我有时不得不这样做,但大多数时候,这种方法不是问题。
    • 您对std::endl 的评论很愚蠢。即使您在需要\r\n 而不是\n 作为其本机行终止符的平台上,\n 仍然是 C 和 C++ 中的换行符终止符,I/O 库会为您转换它。 (这是文本模式和二进制模式流之间的区别。)std::endl 的效率比原始的\n 要低一些,因为它不必要地刷新流。
    • 您可能是对的,但很多年前我确实遇到过问题。这些天几乎没有使用任何东西都存在仅使用“\n”的问题。
    • 再次阅读问题。他特别问如何在不计算每一行的情况下做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多