Ashutosh Aswal
Ashutosh Aswal

Reputation: 575

ANSI escape code not working properly [C++]

I am using the ANSI escape code to print colored output.

I am getting proper colored output in vs code integrated terminal. enter image description here

But when I am running the program in external command-prompt/Powershell, I am not getting the expected colored output.

enter image description here

My program looks something like this:


#define RESET   "\033[0m"
#define RED  "\x1B[31m"
#define GREEN  "\x1B[32m"

int main(int argc, char** argv){
    if(argc != 1){
        std::cout << RED ">> Invalid Arguments!" RESET;
    }else{
        if(verify_password()){
            ...
            ...
            ...
        }else{
            std::cout <<  "\n>> " RED "Invalid Password!" RESET;
        }
    }
    return 0;
}

Complete Code

NOTE: One weird thing I observed is that if I am entering the correct password then everything is working fine in both terminals(getting proper colors). But the problem is when either I am entering an incorrect password or an invalid amount of arguments

What might be the reason for this?

EDIT: I figured out a way to make it work. I found that in order to make these escape codes work I need to have at least one call to system() function. But still, I am not sure how these things are connected.

Upvotes: 1

Views: 2311

Answers (1)

Adrian McCarthy
Adrian McCarthy

Reputation: 47952

Historically, consoles on Windows required use of the console API in the Windows SDK in order to do effects like color. But recent versions of Windows now support escape codes (and even UTF-8), but programs have to opt-in by calling SetConsoleMode with ENABLE_VIRTUAL_TERMINAL_PROCESSING. (Opting in preserves backward compatibility for older programs that aren't using escape codes or UTF-8.)

If you're getting color in some places and not others, then I'd guess there's a problem related to the state the terminal/console is in when sending the escape codes. For example, if the terminal thinks it's already processing an escape code and a new one begins, it might not recognize either. I suppose this might also be a problem if one part of the program uses escape codes but another part uses the Console API.

Upvotes: 3

Related Questions