☆ 不一样的 "hello,world!"

当初初识C语言,第一个程序接触的就是"hello,world!" , 但是看惯了黑色与白色以及固定位置的输出,我们难免也会产生以下问题:

  • 能不能输出五颜六色的语句呢?

        

  • 为什么输出非要在左上角输出呢?

        

  • 为什么运行控制台上端总是显示文件路径,能不能自定义文字呢?

        

  • 运行的时候弹出的控制台大小看着不习惯,有没有可以自定义初始化控制台大小的代码呢?

       

既然这些问题能被提出,当然就会有相应的代码去解决这些问题,下面对以上问题一一解释:

*****************************************************************************************************************************************

1.如何输出不同颜色的语句?

  • 首先声明所需要的库函数:"windows.h"
  • 初始化句柄hout(h+自定义名称):HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE); 
  • 通过控制台函数实现对控制台颜色的更改(绿色):SetConsoleTextAttribute(hout, FOREGROUND_GREEN);
  • 代码如下:
#include <stdio.h>
#include <windows.h>

int main(void)
{
	HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);    	
	SetConsoleTextAttribute(hout, FOREGROUND_GREEN);		
	printf("hello world!\n");
	printf("hello world!\n");
	printf("hello world!\n");
	printf("hello world!\n");
	return 0;
}

但是多输出几局的话我们就又会发现一些问题:

  • 为什么设定了绿色显示之后就所有的都是绿色了呢?
  • 能不能在不同的地方显示不同的颜色?
  • 怎么做才能将其换回原来的颜色呢?

下面首先给出代码(这串代码的运行结果在文章开头,第三条语句输出带有下划线):

#include <windows.h>  
#include <stdio.h>
#include <stdlib.h>
  
int main()  
{  
	HANDLE hOut;  
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);  
	printf("\nhelllo,world!\n");
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN |FOREGROUND_INTENSITY ); 
	printf("helllo,world!\n");
	SetConsoleTextAttribute(hOut,FOREGROUND_BLUE |FOREGROUND_INTENSITY |COMMON_LVB_UNDERSCORE);	 
	printf("helllo,world!\n"); 
	SetConsoleTextAttribute(hOut,FOREGROUND_BLUE |FOREGROUND_INTENSITY |BACKGROUND_RED);
	printf("helllo,world!\n"); 
	SetConsoleTextAttribute(hOut, 0xf0);
	printf("helllo,world!\n");
	SetConsoleTextAttribute(hOut,FOREGROUND_RED |FOREGROUND_GREEN |FOREGROUND_BLUE ); 
	printf("helllo,world!\n");  
	printf("\n\n\n");
//	system("pause");
	return 0;  
}

首先,如果想要另外输出一行不同颜色的语句就要在这条语句之前再额外添加一句颜色控制语句来实现颜色的更改;

对于控制台函数内部的颜色参数,除了基本的英文大写颜色单词之外还可以使用十六进制代码(前两位是前景色,后两位是背景色,十六进制颜色代码不够两位在第一位后面添加小写字母x即可,上面代码中也有示例,这个示例在菜单光标移动时很常见);

  

如果想要以后的输出恢复白色显示,可使用一下代码即可:

SetConsoleTextAttribute(hOut,FOREGROUND_RED |FOREGROUND_GREEN |FOREGROUND_BLUE ); 

2.如何自定义输出语句的位置?

这个功能在这里只进行简单的介绍以解决现有的简单问题,后期这块知识点将会牵涉到很多应用方面;

  • 首先声明所需要的库函数:"windows.h"
  • 定义句柄变量(存放指针的固定地址,可以百度了解具体细节): HANDLE hout;
  • COORD是Windows API中定义的一种结构体,表示一个字符在控制台屏幕上的坐标。其定义为:
typedef struct _COORD
{
    SHORT X;                 // horizontal coordinate
    SHORT Y;                 // vertical coordinate
}COORD;
  • 初始化光标位置 (12列第0行,注意行数与列数是从0开始计算的):COORD pos={12,1};
  • 初始化hout句柄 :hout=GetStdHandle(STD_OUTPUT_HANDLE);    
  • 定位光标位置 :SetConsoleCursorPosition(hout,pos);  
  • 下面给出代码:
#include<stdio.h>
#include<windows.h>

int main()
{
    HANDLE hout;							//实例化句柄hout
    COORD pos={12,1};							//初始化光标位置 
    hout=GetStdHandle(STD_OUTPUT_HANDLE);				//初始化hout句柄 
    SetConsoleCursorPosition(hout,pos);					//定位光标位置  
    SetConsoleTextAttribute(hout,FOREGROUND_GREEN);			//设置控制台颜色 
    printf("Hello,World!\n");
    return 0;
}
  • 运行结果也在文章开头;

3.如何自定义控制台上端显示的文字(两部操作即可)?

  • 首先声明所需要的库函数:"windows.h"
  • 在main函数中使用:system("title 此处为自定义的文字");即可完成更改;
  • 运行结果见文章开头;
    #include <stdio.h>
    #include <windows.h>
    
    int main()
    {
    	system("title 光标打印边框");
    	printf("\n更改控制台标题栏\n");
    	return 0;
    }

4.如何自定义初始化控制台大小?

  • 这也是本次问题中的最后一个了,综合一下前方的问题解决方法来在综合中讲解这个问题的解决办法;
  • 首先给出一个打印边框的代码(可适用于贪吃蛇游戏的边框):
    #include <stdio.h>
    #include <windows.h>
    
    
    void Pos(int x,int y)							//设置光标位置
    {
        COORD pos;
        HANDLE hOutput;
        pos.X=x;
        pos.Y=y;
        hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hOutput,pos);
    }
    
    int main()
    {
    	HANDLE hOut;  
    	hOut = GetStdHandle(STD_OUTPUT_HANDLE); 
    	SetConsoleTextAttribute(hOut,FOREGROUND_GREEN |FOREGROUND_INTENSITY );
    	system("title 光标打印边框");
    	system("mode con cols=60 lines=29"); 		               //显示的控制台的大小
    	int i;
        for(i=0;i<58;i+=2)//打印上下边框
        {
            Pos(i,0);
            printf("■");
            Pos(i,25);
            printf("■");
        }
        SetConsoleTextAttribute(hOut,FOREGROUND_RED |FOREGROUND_INTENSITY );
        for(i=1;i<26;i++)//打印左右边框 
    	{
    		Pos(0,i); 
    		printf("■"); 
    		Pos(56,i); 
    		printf("■");
    	}
    	return 0;
    }
  • 运行结果:

        

****************************************************************************************************************************************

             最快的脚步不是跨越,而是继续,最慢的步伐不是小步,而是徘徊。

****************************************************************************************************************************************

猜你喜欢

转载自blog.csdn.net/qq_42292831/article/details/81294368