假设你想打印出一个很棒的 ASCII 艺术图像,但不想逐行使用 cout
来实现,那该怎么办呢?
假设你想打印出一个很棒的 ASCII 艺术图像,但不想逐行使用 cout
来实现,那该怎么办呢?
相邻的字符串字面量会被拼接在一起,所以你可以这样做:
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"略有不同,因为您还将刷新输出流。
试试这样做:
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中添加。您可以在此处找到有关命令的更多信息,特别是参考前缀“R”,该前缀用于原始字符:https://en.cppreference.com/w/cpp/language/string_literal
"foobar"
也是一个“字符串字面量”。 - HolyBlackCatendl
。虽然这不是(必要的)坏事,但使用endl
会刷新流的缓冲区,并写入一个新行。与您获得的答案中所暗示的相反,使用endl
根本不能帮助将换行符转换为平台通常用于表示行末的字符序列。使用newline
保证与stream << "\n" << flush;
完全等效。将换行符转换为"\r"、"\n"或"\r\n"或其他平台首选的字符是在不同级别上完成的,newline
与此无关。flush
可以(并且经常会)减慢I/O速度,有时甚至会非常明显。只要您只写入几行(例如几百个字符),这可能完全无关紧要。但如果您要写入大文件,则使用endl
而不是"\n"
很容易导致10倍的减速(实际上,我敢说很多人认为iostreams很慢的想法直接源于使用endl
)。endl
可能很有用。同样,如果您正在进行日志记录,并且关键是您的日志始终反映程序的最新已知状态,则endl
可能非常有用,以确保您所写的内容真正被记录,而不会在应用程序崩溃时/如果丢失在缓冲区中。endl
有时是有意义的,但在使用它的95%的时间里,它可能真的不适合(例如,在回答这个问题的任何答案中都不太可能实现任何有用的东西)。这很简单,谢天谢地。只需在需要换行时使用 endl。
cout << stuff << endl
<< morestuff << endl
<< evenmorestuff << endl;
std::endl
的评论很愚蠢。即使你在一个需要 \r\n
而不是 \n
作为本地行终止符的平台上,\n
仍然是 C 和 C++ 中的换行符,并且 I/O 库会为你转换它。(这是文本模式和二进制模式流之间的区别。)std::endl
比原始的 \n
稍微低效一些,因为它不必要地刷新了流。 - jamesdlin