Tyle że to nie gwarantuje sukcesu, ktoś może mieć czarno biały monitor!
PS. Twoim większym zmartwieniem powinno być ustalenie jakie escape cody akceptuje terminal.
PS2. Jak się już bawić to na całego: https://man7.org/linux/man-pages/man4/console_codes.4.html
Nawet, jeżeli do "targetu" tego programu należy również użytkownik czarno-białego monitora, to nie jest to problem. Tekst zostanie wyświetlony poprawnie, bez śmietnika z powodu kodów sterujących. Prędzej może pojawić się śmietnik w przypadku jakiegoś SSH/telnet przez terminal, który nie obsługuje kolorów.
printf (ogólnie interfejs plikowy) to tylko unixy / luinuxy i zależnie od konsoli. Niekoniecznie to musi emulować ansi, inne standardy tez (były) sa popularne.
Kody na inne typy terminala moga być zupełnie niekompatybilne z terminalem ANSI
Dla przenośności, się używa biblioteki ncurses, ale to już nie za bardzo podobne do pchania sekwencji znaków w strumień.
Na windows da się uzyskac przez Win API, ale przed plik to chyba nie....
A propos ANSI
Za DOS-a był sterownik ansi.sys, który wg założenia miał emulowac terminal ansi. W moim kręgu nie spotkałem, aby ktoś używał
Co do standardów, to obecnie w Unix/Linux w konsoli jest de facto "standard' będący połączeniem ANSI i VT100, jeszcze są komendy dorobione specjalnie na użytek XTERM, pomimo, że system MS-DOS i terminal VT100 to już odległa historia. VT100, a także następcy, aż do VT520 nie miały kolorów, a kolory zostały wzięte z ANSI, a jeszcze dorobione dodatkowe (256 kolorów i kolory RGB mimo, że oryginalnie jest tylko 16 kolorów).
Najlepszy opis komend VTxxx/XTERM jest tutaj: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
Niedawno hobbystycznie zajmowałem się tym tematem na potrzeby https://github.com/andrzejlisek/TextPaint i sam stwierdziłem, że VT100 nie jest w pełni kompatybilny z ANSI w sensie, że nie jest możliwa jedna implementacja, która pogodzi oba standardy. Przetestowałem na dużej liczbie "obrazków" z https://16colo.rs/ (jest w wersji graficznej, z którą można porównać) i na dużej liczbie programów w Linux, z vttest
i mc
na czele, a także z animacjami z http://artscene.textfiles.com/vt100/ .
Żeby wszystkie uruchamiane "obrazki" i programy wyświetlały prawidłowo, musiałem umożliwić pracę w dwóch trybach, bo metodą prób i błędów dochodziłem, że zdarzają się przypadki, ze ta sama komenda musi trochę inaczej działać w przypadku DOS/ANSI, a inaczej w przypadku VT100/Linux, jak działało jedno, to drugie już nie działało. Różnice opisałem tu https://github.com/andrzejlisek/TextPaint/blob/master/Readme_ANSI.md , rozdział "DOS vs. standard terminal".
Istnieją komendy "raportowe", czyli takie, na które klient powinien niezwłocznie odpowiedzieć, opisałem w rozdziale "The request-response sequences" tego samego opisu, historycznie służyły do wykrywania modelu posiadanego terminala, a i tak niektóre klienty SSH i konsole przedstawiają się jako "tylko" VT100. Problem będzie, jak terminal nie odpowie na żądanie, będzie potrzebne naciśnięcie klawisza.