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即可,它的操作將會比這個還要簡單。當然,還有一些細節部分需要改動,由於本博客主要分享一下怎麼打印彩色字符,在這裏我就不再贅述了。
希望本文對您有幫助,謝謝閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章