控制台程序设置

       该篇博客主要是对下一篇博客《贪吃蛇游戏》的设计做铺垫,大家可以持续关注(点个关注哦😊)等待更新,以下是个人主页:

        敲上瘾-CSDN博客
 

        在我们写的程序运行起来后弹出的框就是控制台程序。而这个窗口我们是可以对它进行设置的,本章我们就来学习一下如何进行窗口大小设置,窗口标题设置,光标大小和坐标设置与虚拟键码。相关各种函数,数据类型,虚拟键码都配了链接(即蓝色字部分),大家可以通过点击链接学习来帮助理解。

一.窗口设置

1.窗口大小设置

        mode命令可以实现这个操作,比如用cmd命令来设置窗口为30行100列,如下:

                 mode con cols = 100 lines = 30;

        C语言来设置,如下:

        system(" mode con cols = 100 lines = 30 ");

使用systme需要包含头文件<stdlib.h>。

2.窗口标题设置

        title命令是用来设置标题的,用法如下:

                        system(" title 贪吃蛇")

这样可以把窗口标题设置为贪吃蛇,但要注意程序结束后窗口标题也会改变。

二.控制台坐标

    COORD是Windows API中定义的一个结构体类型,表示一个字符在控制台缓冲区的坐标,如图:

8ad457d70c0b4ae598ec7bd49e5eeb87.png

 COORD的声明:

e7a6fd2beaf644f9a0ef2881669e4e4c.png 创建变量并赋值:

                COORD pos={ 5 , 7 };

三.光标设置

1.柄的获取

什么是柄?举个例子:

        比如你在炒菜,一只手用来握锅铲,而另一只手如何控制锅呢?必然是要握住锅的把手,而不是直接用手去握锅面。在这里要操纵控制台就需要得到这个把手,这个把手就叫柄。

柄的类型是HANDLE,这也是WindowsAPI中定义的一个结构体。

获取柄的函数

GetStdHandle函数它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。

声明如下:

HANDLE WINAPI GetStdHandle(_In_ DWORD  nStdHandle);

参数可以取:

STD_INPUT_HANDLE标准输入设备。 
STD_OUTPUT_HANDLE标准输出设备。 
STD_ERROR_HANDLE标准错误设备。 

举个例子:

HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);

2.光标信息获取

结构体 CONSOLE_CURSOR_INFO是储存光标信息的一个类型,声明如下:

typedef struct _CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL  bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

dwSize为光标的大小,bVisible为光标的透明度

获取光标信息的函数GetConsoleCursorInfo

声明如下:

BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);

用法举例:

HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息

3.设置光标信息

函数SetConsoleCursorInfo可用于光标信息设置

声明如下:

BOOL WINAPI SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);

用法举例:

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态

四.获取按键情况

GetAsyncKeyState函数用于获取按键状态

原型如下:
SHORT GetAsyncKeyState(int vKey);
功能:将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。
        GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是起;如果最低位被置为1则说明,该按键被按过,否则为0。如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1.
它的参数是一个虚拟键码,参考链接如下:

虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn

五.<locale.h>本地化

        C语⾔字符默认是采⽤ASCII编码的,ASCII字符集采⽤的是单字节编码,且只使⽤了单字节中的低7位,最⾼位是没有使⽤的,可表⽰为0xxxxxxxx;可以看到,ASCII字符集共包含128个字符,在英语国家中,128个字符是基本够⽤的,但是,在其他国家语⾔中,⽐如,在法语中,字⺟上⽅有注⾳符号,它就⽆法⽤ASCII码表⽰。于是,⼀些欧洲国家就决定,利⽤字节中闲置的最⾼位编⼊新的符号。⽐如,法语中的é的编码为130(⼆进制10000010)。这样⼀来,这些欧洲国家使⽤的编码体系,可以表⽰最多256个符号。但是,这⾥⼜出现了新的问题。不同的国家有不同的字⺟,因此,哪怕它们都使⽤256个符号的编码⽅式,代表的字⺟却不⼀样。⽐如,130在法语编码中代表了é,在希伯来语编码中却代表了字⺟Gimel(),在俄语编码中⼜会代表另⼀个符号。但是不管怎样,所有这些编码⽅式中,0--127表⽰的符号是⼀样的,不⼀样的只是128--255的这⼀段。⾄于亚洲国家的⽂字,使⽤的符号就更多了,汉字就多达10万左右。⼀个字节只能表⽰256种符号,肯定是不够的,就必须使⽤多个字节表达⼀个符号。⽐如,简体中⽂常⻅的编码⽅式是GB2312,使⽤两个字节表⽰⼀个汉字,所以理论上最多可以表⽰256x256=65536个符号。


        后来为了使C语⾔适应国际化,C语⾔的标准中不断加⼊了国际化的⽀持。⽐如:加⼊了宽字符的类型wchar_t 和宽字符的输⼊和输出函数,加⼊了<locale.h>头⽂件,其中提供了允许程序员针对特定地区(通常是国家或者说某种特定语⾔的地理区域)调整程序⾏为的函数

<locale.h>提供的函数⽤于控制C标准库中对于不同的地区会产⽣不⼀样⾏为的部分。
类项:
        通过修改地区,程序可以改变它的⾏为来适应世界的不同区域。但地区的改变可能会影响库的许多部分,其中⼀部分可能是我们不希望修改的。所以C语⾔⽀持针对不同的类项进⾏修改,下⾯的⼀个宏,指定⼀个类项:
• LC_COLLATE:影响字符串⽐较函数 strcoll() 和 strxfrm() 。
• LC_CTYPE:影响字符处理函数的⾏为
• LC_MONETARY:影响货币格式。
• LC_NUMERIC:影响 printf() 的数字格式。
• LC_TIME:影响时间格式 strftime() 和 wcsftime() 。
• LC_ALL-针对所有类项修改,将以上所有类别设置为给定的语⾔环境。

        setlocale函数⽤于修改当前地区,可以针对⼀个类项修改,也可以针对所有类项。setlocale的第⼀个参数可以是前⾯说明的类项中的⼀个,那么每次只会影响⼀个类项,如果第⼀个参数是LC_ALL,就会影响所有的类项。 C标准给第⼆个参数仅定义了2种可能取值:"C"(正常模式)" "(本地模式)
在任意程序执⾏开始,都会隐藏式执⾏调⽤:

正常模式设置:

                    setlocale(LC_ALL, "C");

本地化模式设置:

                    setlocale(LC_ALL, " ");

那如果想在屏幕上打印宽字符,怎么打印呢?
        宽字符的字⾯量必须加上前缀“L”,否则C语⾔会把字⾯量当作窄字符类型处理。前缀“L”在单引号前⾯,表⽰宽字符,对应 wprintf() 的占位符为 %lc ;在双引号前⾯,表⽰宽字符串,对应
wprintf() 的占位符为 %ls,例如:

#include<stdio.h>
#include<locale.h>
int main()
{setlocale(LC_ALL, "");wchar_t k=L'★';wprintf(L"%lc\n", k);wscanf(L"%lc", &k);wprintf(L"%lc\n", k);return 0;
}

输入汉字 于 ,输出结果为: 

63c5ca912cb74b6e839105afaec5919d.png

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

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

相关文章

终于找到恢复照片的绝佳方法了!手机照片恢复的看这里!

当今手机已经彻底离不开我们的生活&#xff0c;手机里面的数据也成为了我们高质量生活的重要构成&#xff0c;当手机内存爆满&#xff0c;我们就不得不采用清除部分手机数据的方法来释放空间。有一些数据删除后往往才发现还另有用处&#xff0c;比如手机里存储着的大量照片。 …

帆软报表实现通过js查询数据库设置表格数据

最近做的一直在做报表相关的需求&#xff0c;自己也是一边学一边做。有一个有意思的需求是在表格中某个单元格在编辑完以后其它的表格中的数据自动填充&#xff0c;当也是根据一定的规则与数据来源才能填充的。 先来点基础概念&#xff0c;就是帆软给我们提供了这个编辑后的事件…

学习笔记:Vue2高级篇

Vue2 学习笔记&#xff1a;Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记&#xff1a;Vue3_ljtxy.love的博客&#xff09;-CSDN博客 文章目录 7.…

《Spring》系列文章目录

Spring Framework是一个为基于Java的现代企业应用程序提供全面编程和配置模型的开源框架。它集成了控制反转&#xff08;IOC&#xff09;、依赖注入&#xff08;DI&#xff09;和面向切面编程&#xff08;AOP&#xff09;等容器技术。Spring框架的设计理念是面向Bean编程&#…

现代图形API综合比较:Vulkan | DirectX | Metal | WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元&#xff0c;可以处理大量数据&#xff0c;例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…

早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 jar包放在web-web-inf中 Boot strap框架 container是两…

【Go语言快速上手(三)】数组, 切片与映射

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. 数组详解3. 切…

平面设计简介:快速了解

在互联网飞速发展的时代&#xff0c;平面设计仍然是很多设计师的职业选择&#xff0c;平面设计也被称为设计的启蒙星。平面设计是什么&#xff0c;无论是想转行进入平面设计行业还是平面设计新秀&#xff1f;什么是平面设计&#xff1f;只有了解这一点&#xff0c;我们才能在未…

制造业信息安全实践——企业信息安全运营规划

前言 制造业作为一个庞大的传统产业&#xff0c;涵盖了汽车、船舶、飞机、家电、新能源等众多领域。当前&#xff0c;无论是国内还是国外的制造业都面临着一个共同的挑战&#xff1a;在计算机和信息时代的背景下&#xff0c;如何跟上IT技术的发展步伐&#xff1f;如何让传统产…

4月21日Linux运维用户相关的添加,分组,修改权限等shell脚本开发第一天

4月21日运维用户相关的添加&#xff0c;分组&#xff0c;修改权限等shell脚本开发第一天 第一天主要实现前2个功能 ​ 主要卡在了&#xff1a; 正确的写法如下&#xff0c;注意[]中的空格&#xff0c;要求很严格&#xff01;&#xff01;&#xff01; #!/bin/bash # 先查看已…

抖音ip地址怎么换位置

抖音&#xff0c;作为一款短视频分享平台&#xff0c;已经成为了许多人展示生活、分享才艺的重要舞台。然而&#xff0c;在抖音的使用过程中&#xff0c;你是否想过更换自己的IP地址位置呢&#xff1f;更换IP地址不仅可以帮助你访问一些地域限制的内容&#xff0c;还可以为你的…

micro-app的css样式隔离

手写微前端micro-app-CSS隔离 子应用的CSS可能会对基座应用或者其他子应用产生的影响 首先现在我们把react页面放入到vue2的页面大家也能看到一些问题了&#xff0c;在react中的index.css中对body的一些css样式&#xff0c;已经影响了基座应用的css。 为了看的更明显&#x…

RabbitMQ学习记录

核心概念 Brocker&#xff1a;消息队列服务器实体 Exchange(消息交换机)&#xff1a;它指定消息按什么规则&#xff0c;路由到哪个队列。 Queue(消息队列载体)&#xff1a;每个消息都会被投入到一个或多个队列。 Binding(绑定)&#xff1a;它的作用就是把exchange和queue按…

提示框增加HTML效果

预期效果&#xff1a;this.$modal.confirm(是否确认删除该条基础设施数据项&#xff1f;请注意删除该路口基础设施点位将并带删除点位下的所有设施)将两句话换行显示且第二句话字体变为红色 官方案例&#xff1a; this.$alert(<strong>这是 <i>HTML</i> 片段…

【团体程序设计天梯赛】L2-052 吉利矩阵

思路&#xff1a; 直接回溯枚举每一个位置填的数&#xff0c;二维肯定是不方便的&#xff0c;我们转成一维&#xff0c;下标x从0到n*n-1。二维数组下标从0到n-1&#xff0c;在一维中下标为x的点在二维中对应行是x/n&#xff0c;列是x%n。 每个数最小能填的是0&#xff0c;最大…

Allegro 导入 EMN 文件,报错“WARNING(SPMHXL-48)”

问题描述&#xff1a; Allegro–> Import–> IDF 导入ME 生成的emn文件&#xff0c;总是出现如下警告&#xff1a; “WARNING(SPMHXL-48): There is existing geometry on Board Geometry / Outline.This geometry may conflict with the IDF data.Review the board out…

【开发篇】本章包括消息订阅、客服配置与使用实战(小程序之云函数开发入门到使用发布上线实操)

客服回复效果图展示 消息订阅效果图展示 一、客服配置 客服消息使用指南传送门 <button open-type="contact" class="fab" ><view class="item"

文本嵌入新方案:合合信息acge模型荣登C-MTEB榜首

目录 0 写在前面1 文本嵌入&#xff1a;LLM落地的根基2 C-MTEB&#xff1a;acge荣夺榜一2.1 max tokens2.2 文本分类2.3 文本聚类 3 acge demo演示与体验总结 0 写在前面 随着信息技术的发展和应用场景的不断扩大&#xff0c;人们需要处理和利用大量的文档信息。而传统的手动处…

C语言实现贪吃蛇项目(2)

先来看看效果&#xff1a; 20240420_212115 文章目录&#xff1a; 3.项目实现3.0宽字符的打印3.01本地化操作setlocale函数宽字符的打印 3.1贪吃蛇结构的创建和维护3.11贪吃蛇结构的创建3.12贪吃蛇的维护 3.2初始化游戏3.21.打印欢迎界面、隐藏光标和设置窗口大小3.22.绘制地图…

js作业微博发言

微博 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" content&q…