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,一经查实,立即删除!

相关文章

人工智能ai 学习_学习代理| 人工智能

人工智能ai 学习Learning is an important part of human behavior. It is the first step in the development phase of any human. When the concept of Artificial Intelligence was proposed, the main approach of the developers was to build a system which could reac…

sql server中同时执行select和update语句死锁问题

原始出处 http://oecpby.blog.51cto.com/2203338/457054 最近在项目中使用SqlServer的时候发现在高并发情况下&#xff0c;频繁更新和频繁查询引发死锁。通常我们知道如果两个事务同时对一个表进行插入或修改数据&#xff0c;会发生在请求对表的X锁时&#xff0c;已经被对方持有…

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

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

C语言实现动画控制

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

mcq 队列_MCQ | 8086微处理器中的寻址模式

mcq 队列Question 1: 问题1&#xff1a; You are given the following instruction: ADD AX , [1024] You are provided the following data: DS 3423H ; SS 1234H ; CS 4567H Find the effective address location for the given instruction. 您得到以下指示&#xff1a;…

聊聊redis分布式锁的8大坑

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

python 唯一元素_检查所有元素在Python中是否唯一

python 唯一元素Here, we are implementing a python program to check whether all elements of a list are unique or not? 在这里&#xff0c;我们正在实现一个python程序来检查列表的所有元素是否唯一&#xff1f; Its very simple to check, by following two steps 按…

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 本代码来源于《父与子的编程之旅——与小卡特一起…

java 生产者消费者代码_Java生产者和消费者代码

java 生产者消费者代码This also helps us to understand the concept of synchronised multi-threading in java, the basic work of our code is that the producer will produce a thread and load it into the memory and after producing the producer thread we would be…

如何给SpringBoot配置轻松加密?

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

secureFX上传文件的时候报错,secureFX崩溃

SecureFX experienced a fatal error and must close.A crash dump file has been......打开注册表&#xff0c;HKEY_CURRENT_MACHINE->SOFTWARE->Vandyke中的secureCRT和secureFX中的license是secureCRT、secureFX的注册信息&#xff0c;不能删除&#xff0c;删除后需要…

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

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

c#中将整数转化为字符串_在C#中将字符串转换为字节数组

c#中将整数转化为字符串Prerequisite: How to declare and use byte[] in C#? 先决条件&#xff1a; 如何在C&#xff03;中声明和使用byte []&#xff1f; C&#xff03;中的字符串到字节数组的转换 (String to Byte Array Conversion in C#) In C#, it is possible that a …

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

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

python序列切片

Python中的序列包括字符串、列表、元组&#xff0c;下面以字符串为例进行演示&#xff0c;列表和元组效果同字符串>>> a0123456789 >>> a[0:2] 01 >>> a[3:5] 34 >>> a[-2] 8 >>> a[0:] 0123456789 >>> a[2:] 23456789 …

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

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

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

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

ruby 生成哈希值_如何检查Ruby中是否存在哈希键?

ruby 生成哈希值We know that Hashes are the instances which are the combination of keys and their values. A particular key in hash may contain more than one value as well. In this article, we will see how we can check or test the presence of a particular ke…