それらの素晴らしいASCIIアート画像の1つを印刷したいとします。cout
各行を個別に使用せずに、どうすればそれを実行できますか?
4 に答える
隣接する文字列リテラルは連結されているため、次のように実行できます。
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.)";
...上記のコードを使用すると、バックスラッシュのような文字を2つ必要とせずに使用することもできます。すべてが表示され、\nなどの制御コードは認識されません。非常に便利です。
これは「文字列リテラル」と呼ばれ、C++11で追加されました。コマンドの詳細については、ここを参照してください。具体的には、raw_charactersのプレフィックス「R」を参照してください:https ://en.cppreference.com/w/cpp/language/string_literal
他の人はすでにを使用することを提案していendl
ます。これは(必然的に)悪いことではありませんが、を使用するendl
と、新しい行を書き込むとともにストリームのバッファがフラッシュされます。あなたが得た答えの1つにある意味とは反対に、を使用しても、改行をプラットフォームが行の終わりを示すために通常使用する文字シーケンスに変換するのに(まったく)役立ちendl
ません。の使用newline
は、と正確に同等であることが保証されていますstream << "\n" << flush;"
。新しい行を「\r」、「\ n」、「\ r \ n」、またはプラットフォームが好むものに変換することは、別のレベルで行われ、それとnewline
は何の関係もありません。
flush
ただし、それによってI / Oが遅くなる可能性があります(多くの場合、遅くなります)。場合によってはかなりの差があります。数行(たとえば、数百文字)しか書いていない限り、それはおそらく完全に無関係です。ただし、大きなファイルを作成している場合は、endl
代わりにを使用すると"\n"
10倍の速度低下が発生する可能性があります(実際、iostreamが遅いという考えの多くは、を使用することに直接起因しますendl
)。
それは、endlを使用する理由が決してないということではありません。flush
ストリームに書き込まれたものはすべて、標準ライブラリのバッファからすぐにフラッシュされ、OSに送信されることを保証します。endl
すぐに表示できるようにしたい場合は、便利です。同様に、ロギングを行っていて、ログが常にプログラムの最新の既知の状態を反映することが重要である場合、endl
書き込んだ内容が実際にログに記録され、バッファで失われないようにするのに(非常に)役立ちます。 /アプリケーションがクラッシュした場合。
したがって、endl
時には理にかなっていますが、おそらくそれが使用される時間の95%は、本当に不適切です(たとえば、この質問への回答のいずれかで有用なことを達成する可能性は低いです)。
ありがたいことに、それはかなり簡単です。別の行を開始するときはいつでもendlを使用してください。
cout << stuff << endl
<< morestuff << endl
<< evenmorestuff << endl;
「\n」だけでなく「\r\ n」が必要なプラットフォームでも機能するはずなので、endlを使用する方がはるかに好きです。