找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3918|回复: 0

git上发现一个很有趣的代码

[复制链接]
发表于 2014-11-20 14:25:13 | 显示全部楼层 |阅读模式
这段代码非常有趣。
可以给printf上色,纯属娱乐,不过非常好玩。在这记录一下。
  1. /*----------------------------------------------
  2. File: printfc.hh -- printf with color
  3. Date: 2014/2/24 16:52:35
  4. Author: js2854@gmail.com
  5. ----------------------------------------------*/
  6. #ifndef __PRINTFC_H__
  7. #define __PRINTFC_H__
  8. #include <stdio.h>
  9. #define MAX_STR_LEN                2048
  10. #ifndef WIN32
  11. #include <stdarg.h> //vsnprintf,va_start,va_end
  12. #include <string.h> //strok
  13. const typedef enum _ForeColor
  14. {
  15.         FG_BLACK                = 30, //黑色
  16.         FG_RED                        = 31, //红色
  17.         FG_GREEN                = 32, //绿色
  18.         FG_YELLOW                = 33, //黄色
  19.         FG_BLUE                        = 34, //蓝色
  20.         FG_PURPLE                = 35, //紫色
  21.         FG_DARKGREEN        = 36, //深绿色
  22.         FG_WHITE                = 37, //白色
  23. }ForeColor;
  24. const typedef enum _BackColor
  25. {
  26.         BG_BLACK                = 40, //黑色
  27.         BG_DARKRED                = 41, //深红色
  28.         BG_GREEN                = 42, //绿色
  29.         BG_YELLOW                = 43, //黄色
  30.         BG_BLUE                        = 44, //蓝色
  31.         BG_PURPLE                = 45, //紫色
  32.         BG_DARKGREEN        = 46, //深绿色
  33.         BG_WHITE                = 47, //白色
  34. }BackColor;
  35. #else
  36. #include <windows.h>
  37. const typedef enum _ForeColor
  38. {
  39.         FG_BLACK                = 0, //黑色
  40.         FG_RED                        = FOREGROUND_INTENSITY | FOREGROUND_RED, //红色
  41.         FG_GREEN                = FOREGROUND_INTENSITY | FOREGROUND_GREEN, //绿色
  42.         FG_YELLOW                = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN, //黄色
  43.         FG_BLUE                        = FOREGROUND_INTENSITY | FOREGROUND_BLUE, //蓝色
  44.         FG_PURPLE                = FOREGROUND_RED | FOREGROUND_BLUE, //紫色
  45.         FG_DARKGREEN        = FOREGROUND_GREEN, //深绿色
  46.         FG_WHITE                = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, //白色
  47. }ForeColor;
  48. const typedef enum _BackColor
  49. {
  50.         BG_BLACK                = 0, //黑色
  51.         BG_DARKRED                = BACKGROUND_RED, //深红色
  52.         BG_GREEN                = BACKGROUND_INTENSITY | BACKGROUND_GREEN, //绿色
  53.         BG_YELLOW                = BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN, //黄色
  54.         BG_BLUE                        = BACKGROUND_INTENSITY | BACKGROUND_BLUE, //蓝色
  55.         BG_PURPLE                = BACKGROUND_RED | BACKGROUND_BLUE, //紫色
  56.         BG_DARKGREEN        = BACKGROUND_GREEN, //深绿色
  57.         BG_WHITE                = BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE, //白色
  58. }BackColor;
  59. #endif
  60. int printfc(ForeColor fc, const char* format_str, ...)
  61. {
  62.         int len = 0;
  63. #ifndef WIN32
  64.         printf("\e[%dm", fc);
  65. #else
  66.         CONSOLE_SCREEN_BUFFER_INFO oldInfo = {0};
  67.         HANDLE hStd = ::GetStdHandle(STD_OUTPUT_HANDLE);
  68.         if (hStd != INVALID_HANDLE_VALUE && GetConsoleScreenBufferInfo(hStd, &oldInfo))
  69.         {
  70.                 SetConsoleTextAttribute(hStd, fc);
  71. #endif
  72.        
  73.                 va_list p_list;
  74.                 va_start(p_list, format_str);
  75.                 len = vprintf(format_str, p_list);
  76.                 va_end(p_list);
  77. #ifndef WIN32
  78.                 printf("\e[0m");//关闭所有属性
  79. #else
  80.                 SetConsoleTextAttribute(hStd, oldInfo.wAttributes);
  81.         }
  82. #endif
  83.         return len;
  84. }
  85. int printfc(ForeColor fc, BackColor bc, const char* format_str, ...)
  86. {
  87.         int len = 0;
  88. #ifndef WIN32
  89.         static char text[MAX_STR_LEN] = {0};
  90.         memset(text, 0, sizeof(text));
  91.         va_list p_list;
  92.         va_start(p_list, format_str);
  93.         len = vsnprintf(text, sizeof(text), format_str, p_list);
  94.         va_end(p_list);
  95.         const char *split = "\n";
  96.         char *p = strtok(text, split);
  97.         bool last_is_lf = (text[len-1] == '\n');
  98.         while(p != NULL)
  99.         {
  100.                 printf("\e[%d;%dm%s\e[0m", fc, bc, p);
  101.                 p = strtok(NULL, split);
  102.                 if (p != NULL || last_is_lf) printf("\n");
  103.         }
  104. #else
  105.         CONSOLE_SCREEN_BUFFER_INFO oldInfo = {0};
  106.         HANDLE hStd = ::GetStdHandle(STD_OUTPUT_HANDLE);
  107.         if (hStd != INVALID_HANDLE_VALUE && GetConsoleScreenBufferInfo(hStd, &oldInfo))
  108.         {
  109.                 SetConsoleTextAttribute(hStd, fc|bc);
  110.                
  111.                 va_list p_list;
  112.                 va_start(p_list, format_str);
  113.                 len = vprintf(format_str, p_list);
  114.                 va_end(p_list);
  115.                
  116.                 SetConsoleTextAttribute(hStd, oldInfo.wAttributes);
  117.         }
  118. #endif
  119.        
  120.         return len;
  121. }
  122. #endif //__PRINTFC_H__
复制代码


您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-24 13:17 , Processed in 0.018235 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表