如何为数组的特定区域上色(如火箭头部)
为C语言字符数组的特定区域添加ANSI颜色
要给火箭字符数组的特定区域上色,核心思路是放弃整行打印,改为逐个字符遍历判断,针对目标位置的字符插入ANSI颜色控制码,打印后再重置颜色。以下是具体实现方案:
步骤1:定义颜色宏(可选但推荐)
先把常用的ANSI颜色码定义成宏,让代码更易读:
#define RED "\e[31;1m" // 亮红色 #define YELLOW "\e[33;1m" // 亮黄色 #define RESET "\e[0m" // 重置颜色,恢复默认
你也可以直接替换成你提供的颜色码,比如#define RED "\e[31;10m"。
步骤2:修改打印逻辑,逐个字符处理
原来的代码是整行输出rocket[i],现在改成嵌套循环遍历每个字符的坐标(i,j),通过条件判断识别目标区域,再针对性上色:
完整修改后的代码
#include <stdio.h> #define LINE 11 #define COLN 11 // 自定义ANSI颜色宏 #define RED "\e[31;1m" #define YELLOW "\e[33;1m" #define RESET "\e[0m" const char rocket[LINE][COLN] ={ " ^ ", " /^\\ ", " |-| ", " | | ", " |W| ", " |E| ", " |E| ", " |E| ", " /| |\\ ", " / | | \ ", " | | | | " }; int main(){ for(int i = 0; i < LINE; i++){ for(int j = 0; j < COLN; j++){ // 匹配火箭头部区域:前3行的核心符号 if ((i == 0 && j == 5) || (i == 1 && (j >=4 && j <=6)) || (i == 2 && (j >=4 && j <=6))) { printf("%s%c%s", RED, rocket[i][j], RESET); } // 匹配WEEE区域:第4-7行的中间字符 else if ((i >=4 && i <=7) && j ==5) { printf("%s%c%s", YELLOW, rocket[i][j], RESET); } // 其他字符正常打印 else { printf("%c", rocket[i][j]); } } printf("\n"); // 每行结束换行 } printf("\n"); printf("%sBut if I want to color specific parts like the description, WEEE. %s\n", YELLOW, RESET); printf("%sIn the rocket, what will it be like?%s\n", RED, RESET); }
关键逻辑说明
- 坐标匹配:通过字符的行号
i和列号j定位目标区域,比如:- 火箭头部的
^在第0行第5列(i=0,j=5) - 第1行的
/^\对应列号4、5、6(j>=4 && j<=6)
- 火箭头部的
- 颜色控制:打印目标字符前先输出颜色码,打印后必须输出
RESET,否则后续所有字符都会继承当前颜色。 - 扩展性:如果需要上色的是矩形区域,可以直接用范围判断,比如
i >=2 && i <=5 && j >=3 && j <=7;也可以把区域判断封装成函数,让代码更整洁。
内容的提问来源于stack exchange,提问作者Exponecial
相关产品推荐
相关产品推荐

