版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dark_cy/article/details/88090887
说在前头:
之前同学给我发了一个输出彩色心的代码,效果如下图。感觉很新奇,就研究了一下。这个心输出时每个字符之间有一毫秒的间隔,且中间有“我喜欢你!”的汉字。在运行至下图的效果之后,输入任意字符就会进入一个一直输出心的无限循环中,但是其颜色会与之前输出的不一样。
在弄懂怎么样设置控制台字符颜色之后,我就对“我喜欢你”这几个汉字起了兴趣,代码中明明没有汉字,那这几个字又是怎么输出的呢?怀揣着这份好奇心我又仔细看了一遍代码,发现他是以字符的形式输出的整型数,这让我想到了ASCLL码与字符之间的关系。于是我去询问度娘,遂得知了以下内容。
以下是干货:
先告诉你:两个特定的ASCLL码,紧挨着按字符型(%c)输出就会组成一个汉字!
1、对于ASCII码中的字符,一个字符占一个字节的空间。而一个中文汉字(包括中文标点)占两个字节的空间。
2、对于ASCLL码,33、-223、289表示的是同一个字符‘ !’,其实就是以256为一个循环。
3、任意两个属于[128,256](由2可知任何数都可以通过加或减256转化为该区间的数)的ASCLL码都可以组成一个汉字,理论上所有的汉字都可以用ASCLL码表示。
怼个代码先
#include<stdio.h>
int main()
{
int a[]={196,227,186,195,194,240},i;//数组a[]中的六个数表示ASCLL码值
for(i=0;i<6;i++) //每两个ASCLL码组成一个汉字
{ //其中196和227组成'你'、186和195组成'好'、194和240组成'吗'
printf("%c",a[i]);
}
printf("\n");
return 0;
}
输出结果为:你好吗
需要注意的是:组成一个汉字的两个ASCLL码在输出的时候必须紧挨!其之间不能有任何字符。否则会造成乱码。
看了上面的代码相信你已经知道怎么把ASCLL码转化成汉字了,但是,你如何知道你想要转化汉字的ASCLL值呢?
下面的代码会告诉你
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define U 0.1
#define V 0.053//U、V用于控制心的形状
void SetColor(unsigned short ForeColor,unsigned short BackGroundColor)
{
HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,(ForeColor)|(BackGroundColor));
// SetConsoleTextAttribute函数:是系统设置控制台背景色和前景色的函数 ,在头文件windows.h中
// Set Console TextAttribute 汉意:设置控制台的文本属性
/*
原型为:
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes)
*/
//hCon:是一个 HANDLE 类型的变量,句柄,某种结构的唯一标识(其值是一个整型数)
//ForeColor:前景色(字符颜色);BackGroundColor:背景色,用十六进制数表示
}
int main()
{
int i,s=0,t,a=10,b=11,c=12,d=13,e=14;
int z[] = {32,32,206,210,207,178,187,182,196,227,33,32,32};//" 我喜欢你! " 的 ASCLL码
float x,y,m;
for(y=1.3; y>=-1.1; y-=U)
{
for(x=-2; x<1.4; x+=V)
{
if((((x*x+y*y-1)*(x*x+y*y-1)*(x*x+y*y-1)-x*x*y*y*y)<=0))//心形线的公式
{
if(y>=1.3-10*U||y<=1.3-11*U)
{
s++;
if(s%4==1)
{
SetColor(a,0);
printf("l");
}
if(s%4==2)
{
SetColor(e,0);
printf("o");
}
if(s%4==3)
{
SetColor(c,0);
printf("v");
}
if(s%4==0)
{
SetColor(d,0);
printf("e");
}
}
else
{
for(i = 0; i < 42; i++)
{
if(i<=14||i>=28)
{
s++;
if(s%4==1)
{
SetColor(a,0);
printf("l");
}
if(s%4==2)
{
SetColor(e,0);
printf("o");
}
if(s%4==3)
{
SetColor(c,0);
printf("v");
}
if(s%4==0)
{
SetColor(d,0);
printf("e");
}
}
else
{
SetColor(b,0);
printf("%c", z[i-15]);//输出"我喜欢你"
Sleep(50); //延时函数,以毫秒为单位,包含在头文件windows.h中
}
}
break;
}
}
else
printf(" ");
Sleep(1);
}
printf("\n");
}
printf("请按任意键继续!");
getchar();
while(1)
{
system("cls");//清屏操作
t=a;
a=b;
b=c;
c=d;
d=e;
e=t;
for(y=1.3; y>=-1.1; y-=U)
{
for(x=-2; x<1.4; x+=V)
{
if((((x*x+y*y-1)*(x*x+y*y-1)*(x*x+y*y-1)-x*x*y*y*y)<=0))
{
if(y>=1.3-10*U||y<=1.3-11*U)
{
s++;
if(s%4==1)
{
SetColor(a,0);
printf("l");
}
if(s%4==2)
{
SetColor(b,0);
printf("o");
}
if(s%4==3)
{
SetColor(c,0);
printf("v");
}
if(s%4==0)
{
SetColor(d,0);
printf("e");
}
}
else
{
for(i = 0; i < 42; i++)
{
if(i<=14||i>=28)
{
s++;
if(s%4==1)
{
SetColor(a,0);
printf("l");
}
if(s%4==2)
{
SetColor(b,0);
printf("o");
}
if(s%4==3)
{
SetColor(c,0);
printf("v");
}
if(s%4==0)
{
SetColor(d,0);
printf("e");
}
}
else
{
SetColor(e,0);
printf("%c", z[i-15]);
}
}
break;
}
}
else
printf(" ");
}
printf("\n");
}
Sleep(1000);
}
return 0;
}