Cambio Colores en un solo printf en C

Iniciado por zkraven, 19 Junio 2018, 19:22 PM

0 Miembros y 1 Visitante están viendo este tema.

zkraven

Hola buenas, tengo una duda acerca de cómo cambiar los colores de un solo printf en el lenguaje C, no en C++.
El problema que quiero resolver es el siguiente, si en un scanf por ejemplo introducimos un 0 y lo imprimimos aparece que es válido y el texto debería de ir en verde, sin embargo si es un numero distinto a 0 el texto debería de ir en rojo.
Es decir, como cambiar el color de un solo printf no el de la consola ni el de el fondo de consola.

MAFUS

El texto de la consola depende de la consola. Windows y Linux tienen diferentes formas de hacerlo.

0xFer

Creo que cualquier terminal es compatible con los códigos:

Fuente

#include <stdio.h>

#define ANSI_COLOR_RED     "\x1b[31m"
#define ANSI_COLOR_GREEN   "\x1b[32m"
#define ANSI_COLOR_YELLOW  "\x1b[33m"
#define ANSI_COLOR_BLUE    "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN    "\x1b[36m"
#define ANSI_COLOR_RESET   "\x1b[0m"

int main () {

  printf(ANSI_COLOR_RED     "This text is RED!"     ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_GREEN   "This text is GREEN!"   ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_YELLOW  "This text is YELLOW!"  ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_BLUE    "This text is BLUE!"    ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_MAGENTA "This text is MAGENTA!" ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_CYAN    "This text is CYAN!"    ANSI_COLOR_RESET "\n");

  return 0;
}



Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

Thiamatt

#3
Hola!

Para poner colores en C/C++, vas a depender del Sistema Operativo al que esté dirigido tu programa.

En caso de WINDOWS:


#include <stdlib>
#include <Windows.h>  // API del Sistema Operativo de Windows (Permite trabajar sobre la Consola).

// <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
void Color(int Background, int Text); // Prototipo de función          

enum Colors { // Listado de colores (La letra "L" al inicio, indica que es un color más claro que su antecesor).
BLACK = 0,
BLUE = 1,
GREEN = 2,
CYAN = 3,
RED = 4,
MAGENTA = 5,
BROWN = 6,
LGREY = 7,
DGREY = 8,
LBLUE = 9,
LGREEN = 10,
LCYAN = 11,
LRED = 12,
LMAGENTA = 13,
YELLOW = 14,
WHITE = 15
};
// <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

int main(){

Color(BLACK, LGREEN); printf("Texto en color Verde Claro y fondo Negro");
Color(BLACK, RED);    printf("Texto en color Rojo y fondo Negro");
Color(WHITE, BLACK);  printf("Texto en color Negro y fondo Blanco");
       Color(BLACK, WHITE); // Devolvemos el color original de la consola.
       printf("Volvimos a la normalidad!");
return 0;
}

void Color(int Background, int Text){ // Función para cambiar el color del fondo y/o pantalla

HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE); // Tomamos la consola.

// Para cambiar el color, se utilizan números desde el 0 hasta el 255.
// Pero, para convertir los colores a un valor adecuado, se realiza el siguiente cálculo.
int    New_Color= Text + (Background * 16);

SetConsoleTextAttribute(Console, New_Color); // Guardamos los cambios en la Consola.

}


Explicación del código:

La biblioteca "Windows.h" es la API que proporciona el Sistema Operativo "Windows" para programar sobre él (Consola, GUI, etc).

Entonces, declaramos la función "Color" que recibe 2 argumentos:
  * Fondo: Esta variable va a indicar el color del fondo de la sección de la consola (Almacenado en la variable "Background")
  * Color:  Esta variable va a indicar el color del texto indicado (Almacenado en la variable "Color")

Para facilitar el proceso de indicado de colores, se crea una lista con el nombre del color y su valor. Entonces, para mencionar al color blanco, se utilizará "WHITE" en vez de "15".
Volviendo a la función, se toma el manejador o la Consola , para poder aplicar los cambios sobre la misma. Luego, creamos una variable llamada "New_Color" que almacenará el número de la combinación entre el color elegido para el fondo y el color de texto, por medio de un simple cálculo:

                                                                     
COLOR = COLOR_DE_TEXTO + (COLOR_DE_FONDO * 16)
Terminado el cálculo, modificamos los atributos del texto de la consola, agregando el nuevo valor.

En caso de querer detener el cambio de color, se tendrá que volver a recurrir a la función (Ejemplo en el código).
Esto es solo una simple base, ya que puedes crear funciones para devolver los colores originales, aunque no son necesarias.



Espero que te haya servido de ayuda.
Buena suerte!  ;D