C语言打印彩色字符——以(枚举法+字符串查找)为例展示

文章目录

  • C语言颜色头文件——自制非常简单的调用函数
  • 实战演练——一个基础的枚举变量小程序
  • 牛刀小试——查找字符小程序

C语言颜色头文件——自制非常简单的调用函数

显然,C语言是不会提供打印彩色字符的标准函数,而我们有时候为了强调C语言打印的部分字符,或者仅仅是为了做一个明显而好看的标记而需要改变打印的颜色,幸运的是,C语言还是可以实现的。之前在CSDN上搜索的很多方法都在VC6以及DEVC++用不了,很多使用者可能为之头疼,在此介绍一种在VC6和DEVC++里面都可以用的方法。
一般的C编译器都有这个<windows.h>,<winnt.h>头文件,我们如果要方便地使用调整打印颜色的指令的话,不妨事先写好一个color.h的用户头文件,每次需要用到时就放在我们的C程序的同目录下,需要的时候直接#include "color.h"即可。下面就是我写的一个color.h的头文件,仅供大家参考。
color.h头文件如下:

#include <windows.h>
#include <winnt.h>
#include <stdio.h>
//定义颜色 
#define BLACK 0	//黑色 
#define BLUE 1	//蓝色 
#define GREEN 2	//绿色 
#define LAKEBLUE 3	//湖蓝色 
#define RED 4	//红色 
#define PURPLE 5	//紫色 
#define YELLOW 6	//黄色 
#define WHITE 7		//白色 
#define GREY 8	//灰色 
#define LIGHTBLUE 9 //淡蓝色 
#define LIGHTGREEN 10	//淡绿色 
#define LIGHTRED 11	//淡红色 
#define LIGHTPURPLE 12	//淡紫色 
#define LIGHTYELLOW 13	//淡黄色 
#define BRIGHTWHITE 14	//亮白色
void setcolor(int color)
{HANDLE hConsoleWnd;hConsoleWnd = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsoleWnd,color);
}

这里需要说明的是,系统里面自带的颜色只有15种,但对于我们日常使用已经足够了,如果需要更深入地在颜色上下功夫,可以取Easyx的官网上下载easyx的头文件和lib文件,会获得更佳的视觉效果。
HANDLE是一个句柄操作,这里我们不需要对系统自带的头文件有过多的了解,毕竟我们做的是应用软件不是系统软件,几行代码就涵盖了我们需要修改的颜色,这里把int型color变量作为传递的参数,然后把15中系统自带的颜色定义为符号常量就ok(当然你也可以定义你想要的符号,只要你知道它是什么颜色)。

实战演练——一个基础的枚举变量小程序

现在用一个简单有趣的问题来做打印颜色字符的演示——枚举变量的使用。众所周知,C语言有枚举变量类型enum,我们不妨定义一个袋子里面装了5中颜色的球,一次取一个球,总共取三次,问可能的取法有哪些?这是一个很简单的枚举变量的题目,打印也非常简单,但如果我们将取出的球对应颜色呢?是不是就非常有趣,请看以下代码:
template.c头文件如下:

#include "color.h"//包含了stdio的头文件
enum Color {red,blue,green,yellow,white};
void colorprintf(enum Color color);
int main()
{int i,count=0;enum Color {red,blue,green,yellow,white};enum Color color[3];printf("*****************枚举类型变量实验(穷举法算法)*********************\n");printf("从红球、蓝球、绿球、黄球和白球中依次取出3个球,求可能的取法:\n");for(color[0]=red;color[0]<=white;color[0]++){for(color[1]=red;color[1]<=white;color[1]++){if(color[0]!=color[1]){for(color[2]=red;color[2]<=white;color[2]++){if(color[2]!=color[0]&&color[2]!=color[1]){printf("|%d\t",++count);for(i=0;i<3;i++){colorprintf(color[i]);printf("\t");}printf("\n");}}}}}return 0;} 
void colorprintf(enum Color color)
{switch(color){ case blue:	setcolor(BLUE);printf("蓝球");break;	//蓝色 case green: setcolor(GREEN);printf("绿球");break;	//绿色 case red: 	setcolor(RED); printf("红球");break;//红球 case yellow:setcolor(YELLOW);printf("黄球");break;//黄色 case white: setcolor(WHITE);printf("白球");break;	//白色 }setcolor(WHITE);//还原系统色 
}

打印的效果如下图:
打印彩色字符实验——枚举变量

牛刀小试——查找字符小程序

现在感觉打印彩色字符还有点小意思,至少花花绿绿的程序看起来就比黑白的炫很多,当然,打印彩色字符还有一个更有用的应用,就是查找类的程序,一般要表示查找到的字符(串)又不损坏原来的字符(串),那么改变字符串的颜色就是最好的选择。现在有一段英文文字,我们要查找单词"the"(当然你也可以在程序执行时输入你想要的单词)。
The man himself lay in the bed.For a long while we just stood there, looking down at the profoundand fleshless grin. The body had apparently once lain in the attitude of anembrace, but now the long sleep that outlasts love, that conquers even thegrimace of love, had cuckolded him. What was left of him, rotted beneath whatwas left of the nightshirt, had become inextricable from the bed in which helay; and upon him and upon the pillow beside him lay that even coating of thepatient and biding dust.Then we noticed that in the second pillow was the indentation of ahead. One of us lifted something from it, and leaning forward, that faint andinvisible dust dry and acrid in the nostrils, we saw a long strand of iron-grayhair.

【注】本段文字来源网络《献给艾米丽的玫瑰》
将这段文字导入文本文档,建立一个txt文件,假设就叫它sample.txt吧,放在C文件的同目录下,然后再将我们之前编好的color.h头文件放在C程序的同目录下,好戏开始:
main.c文件代码:

#include "color.h"
#include <string.h>
#include <stdlib.h>
void find_str(char *p,char *p0);
void move(char *p,int n);//
int main()
{char p[2000],p0[30],*ch;FILE *fp;//文件指针 printf("读入sample文件中...:\n");fp=fopen("sample.txt","r");if(fp==NULL){printf("读入文件失败!");return 2;//非正常返回 }for(ch=p;!feof(fp);ch++){*ch=fgetc(fp);putchar(*ch);//打印到文件夹 }*ch=0;//添加一个字符串结束符 printf("\n读入文件成功!\n需要查找的字符串:\n");gets(p0);if (strstr(p,p0)==NULL){printf("未找到该字符串!\n");return 1;//非正常返回 }find_str(p,p0);return 0;
}
void find_str(char *p,char *p0)
{char *p1,*p2;p1=p; p2=strstr(p,p0);while(p2!=NULL){move(p2,1);*p2=0;printf("%s",p1);p1=p2+1;p2+=strlen(p0)+1;move(p2,1);*p2=0;setcolor(LAKEBLUE);printf("%s",p1);//打印被查找的字符串setcolor(WHITE);p1=p2+1;//p1到达p2查找到的字符串的末尾p2=strstr(p1,p0);//p2沿着p1的起始位置继续查找 }printf("%s",p1); 
}
void move(char *p,int n)//p为操作点处的地址,n为偏移量 
{int i;char *q;if(n>0)//若n>0,数组后移,先操作的应该是数组最后一个元素{for(i=0,q=p+strlen(p);q-p>=0;q--)//从p字符串的结束符'\0'开始后移{*(q+n)=*q;}}else if(n<0)//若n<0,数组前移,先操作的是数组的第一个元素{for(i=0,q=p;q-p<=strlen(p);q++)//从第一个字符开始前移,一直移动到p字符串的结束符'\0'{*(q+n)=*q;}}//n=0时误操作
}

这个程序是字符串指针的应用,还是有点难度的,对初学者来看可能有点难理解,不过多写写就会发现也没有想象得那么难,你们如果运行这串代码,输出效果图就会如下图所示:
查找字符串变量
OK,看起来还不错,由于我们是按字符读入并且查找的,所以会把含有the的所有字符查找进去,比如说there,但如果我们稍稍修改一下我们存储的数据结构,将fgetc,fputc改成fgetc和fgets即可,它的操作将会比这个还要简单。当然,还有一些细节部分需要改动,由于本博客主要分享一下怎么打印彩色字符,在这里我就不再赘述了。
希望本文对您有帮助,谢谢阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再见 Spring Task,这个定时任务框架真香!

最近有朋友问到定时任务相关的问题。于是&#xff0c;我简单写了一篇文章总结一下定时任务的一些概念以及一些常见的定时任务技术选型。希望能对小伙伴们有帮助&#xff01;个人能力有限。如果文章有任何需要补充/完善/修改的地方&#xff0c;欢迎在评论区指出&#xff0c;共同…

C语言实现动画控制

文章目录原材料说明一场革命原材料 下载原材料网址: https://www.easyx.cn/downloads/ 下载easyx2014冬至版&#xff0c;将lib文件放在编译器默认的lib文件夹&#xff0c;h头文件放在编译器默认的include文件夹即可 说明 C语言可以用系统内部的定时函数sleep和usleep定时(需…

聊聊redis分布式锁的8大坑

前言在分布式系统中&#xff0c;由于redis分布式锁相对于更简单和高效&#xff0c;成为了分布式锁的首先&#xff0c;被我们用到了很多实际业务场景当中。但不是说用了redis分布式锁&#xff0c;就可以高枕无忧了&#xff0c;如果没有用好或者用对&#xff0c;也会引来一些意想…

MyBatis 批量插入数据的 3 种方法!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone批量插入功能是我们日常工作中比较常见的业务功能之一&#xff0c;之前我也写过一篇关于《MyBatis Plus 批量数据插入功能&#xff0c;yy…

MongoDB: The Definitive Guide

第一章 简介 MongoDB是面向文档的数据库&#xff0c;不是关系型数据库。内置对MapReduce的支持&#xff0c;以及对地理空间索引的支持。 丰富的数据模型容易扩展&#xff0c;它所采用的面向文档的数据模型可以使其在多台服务器之间分割数据丰富的功能&#xff0c;索引、存储Jav…

Python联网下载文件

声明 Python版本2.7.3所需Py文件——urllib22.7.3版本的Python Shell即可直接执行&#xff0c;但需要联网若程序执行成功&#xff0c;则会下载以下网址的txt文本并打印在shell中 http://helloworldbook2.com/data/message.txt 本代码来源于《父与子的编程之旅——与小卡特一起…

如何给SpringBoot配置轻松加密?

在实践中&#xff0c;项目的某些配置信息是需要进行加密处理的&#xff0c;以减少敏感信息泄露的风险。比如&#xff0c;在使用Druid时&#xff0c;就可以基于它提供的公私钥加密方式对数据库的密码进行加密。但更多时候&#xff0c;比如Redis密码、MQ密码等敏感信息&#xff0…

C语言将循环小数/有限小数转换为分数

文章目录数学基础编程思路代码数学基础 早在小学的时候我就对循环小数非常感兴趣&#xff0c;加上初中和高中对循环小数可以说有一定基础研究&#xff0c;因此想到写一个将循环下小数转换为分数的程序&#xff0c;非常有意思&#xff0c;并且对初学者来说&#xff0c;它的输入…

升级了 Windows 11 正式版,有坑吗?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;今天磊哥去公司上班&#xff0c;惊喜的发现 Windows 提示更新了&#xff0c;并且是 Windows 11 正式版&#xff0c;这太让人…

C语言结构体的应用——万年历

文章目录万年历简述代码万年历简述 万年历——就是输入一个日期可以查询是星期几&#xff0c;这个功能看起来很普通&#xff0c;但是如果用程序时间的话&#xff0c;还是药费一番周折: 我们需要保存一个固定的日期&#xff0c;存放它是星期几&#xff0c;输入一个自定义的日期…

@Value竟然能玩出这么多花样

前言对于从事java开发工作的小伙伴来说&#xff0c;spring框架肯定再熟悉不过了。spring给开发者提供了非常丰富的api&#xff0c;满足我们日常的工作需求。如果想要创建bean实例&#xff0c;可以使用Controller、Service、Repository、Component等注解。如果想要依赖注入某个对…

C语言实现线性动态(单向)链表【详细步骤】

文章目录什么是链表为什么不用结构体数组链表的操作创建表删除元素插入元素代码及运行结果什么是链表 链表是数据结构里面的一种&#xff0c;线性链表是链表的一种&#xff0c;线性链表的延伸有双向链表和环形链表。在编程语言中优化数据结构可以在处理大数据时大大降低程序的…

移动前端经验小结

1. 移动端头部标签 head meta <!DOCTYPE html> <!-- 使用 HTML5 doctype&#xff0c;不区分大小写 --> <html lang"zh-cmn-Hans"> <!-- 更加标准的 lang 属性写法 http://zhi.hu/XyIa --> <head><!-- 声明文档使用的字符编码 -->…

再见收费的Navicat!操作所有数据库靠它就够了!

为了快速管理数据库&#xff0c;我们一般都会选择一款顺手的数据库管理工具。Navicat、DataGrip虽然很好用&#xff0c;但都是收费的。今天给大家推荐一款免费、功能强大的数据库管理工具DBeaver&#xff0c;希望对大家有所帮助&#xff01;DBeaver简介 DBeaver是一款开源的数据…

查找两个字符串中相同字符串_使两个字符串相同的最低成本

查找两个字符串中相同字符串Problem statement: 问题陈述&#xff1a; Given two strings string1 and string2 find the minimum cost required to make the given two strings identical. We can delete characters from both the strings. The cost of deleting a characte…

Matlab对指定参数的曲线进行非线性拟合

Matlab拟合曲线的方式 Matlab拟合曲线的方式有很多种&#xff0c;有三次样条插值、线性插值、多项式拟合等等。多项式拟合由于函数由f(x)anxnan−1xn−1...a1xa0f(x)a_nx^na_{n-1}x^{n-1}...a_1xa_0f(x)an​xnan−1​xn−1...a1​xa0​组成&#xff0c;若采用最小二乘法拟合&a…

MyBatis原生批量插入的坑与解决方案!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;前面的文章咱们讲了 MyBatis 批量插入的 3 种方法&#xff1a;循环单次插入、MyBatis Plus 批量插入、MyBatis 原生批量插入…

系统结构图 数据结构_数据结构图简介

系统结构图 数据结构What you are going to learn? 你要学什么&#xff1f; In this article, we learn about the introduction to Graphs in Data Structure and Algorithm. 在本文中&#xff0c;我们将了解图在数据结构和算法中的介绍 。 What are the components in Gra…

Matlab仿真PID控制(带M文件、simulink截图和参数分析)

文章目录0.符号说明1.如何根据连续系统建立差分方程1.1.获取连续系统的传递函数1.2.获取离散系统的传递函数1.3.转换为差分方程2.基本PID控制原理3.比较PID输出&#xff0c;分析参数产生的影响4.改进PID算法&#xff08;遇限削弱积分法&#xff09;5.simulink仿真0.符号说明 y…

再见 Postman!Apifox 才是 YYDS!

作为开软件开发从业者&#xff0c;API 调试是必不可少的一项技能&#xff0c;在这方面 Postman 做的非常出色。但是在整个软件开发过程中&#xff0c;API 调试只是其中的一部分&#xff0c;还有很多事情 Postman 无法完成&#xff0c;或者无法高效完成&#xff0c;比如&#xf…