函数基于某个博客实现的printf,对其函数内部增加了对文本颜色的控制。
原博客地址:自己实现的printf函数_行者三个石的博客-CSDN博客_自己实现printf函数
说明:
用法:将my_print.h头文件添加,即可使用!
注意事项:
1、无法对浮点数进行小数点后数量的精度控制。
2、使用时必须要设置文本颜色参数,默认设置为NULL
示例代码
#include <iostream>
#include "my_print.h"
using namespace std;
int main(int argc, char* argv[])
{
myPrint("adf:%f\n", NULL, 12.00);
myPrint("adf:%s\n", RED, "hello");
myPrint("adf:%d\n", GREEN, 999);
myPrint("adf:%c\n", BLUE, 'C');
return 0;
}
my_print.h实现代码
#include <stdio.h>
#include <stdarg.h>
#include <Windows.h>
//文本颜色定义
#define RED 1 //红
#define GREEN 2 //绿
#define BLUE 3 //蓝
#define DEFAULT 0 //默认颜色 与 textColor填入NULL 等价
void myPrint(const char *str, int textColor, ...)
{
//设置文本颜色
if (textColor == RED)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
}
else if (textColor == GREEN)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
else if (textColor == BLUE)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
}
va_list var;
char c = 0;
unsigned int ui = 0;
int i = 0;
float f = 0;
double d = 0;
char *s = NULL;
va_start(var, str);
while ('\0' != *str)
{
if ('%' != *str)
{
printf("%c", *str);
str++;
continue;
}
else
{
//va_arg函数返回ap当前指向的参数的值
//每次调用va_arg后,ap就会指向下一个参数
(char)va_arg(var, int);//过滤掉第一个颜色参数
switch (*(++str))
{
case 'c':
c = (char)va_arg(var, int);
printf("%c", c);
break;
case 'u':
ui = (unsigned int)va_arg(var, int);
printf("%u", ui);
break;
case 'd':
i = va_arg(var, int);
printf("%i", i);
break;
case 'f':
f = (float)va_arg(var, double);
printf("%f", f);
break;
case 'l':
if ('f' == *(str + 1))
{
d = va_arg(var, double);
printf("%lf", d);
str++;
}
break;
case 's':
s = (char*)va_arg(var, char*);
printf("%s", s);
break;
default:
printf("%c", *str);
break;
}
str++;
}
}
va_end(var);
//恢复初始颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
}