Windows控制台函数:移动光标位置函数SetConsoleCursorPosition()
目录
什么是 SetConsoleCursorPosition?
它长什么样?
什么是 COORD?
怎么用它?
它有什么用?
跟 C++ 标准库有什么不一样?
注意事项
再试一个有趣的例子
什么是 SetConsoleCursorPosition?
SetConsoleCursorPosition 是一个 Windows API 函数,用来移动控制台的光标位置。你可以把它想成一个遥控器,告诉屏幕上的那个闪烁小光标(就是输入文字时跳动的那个小线):“嘿,去这个位置等着!”
在控制台程序里,默认情况下,光标会随着你输入或输出的文字自动移动。但如果你想自己控制它,比如让文字出现在屏幕的特定位置(像画图或做游戏那样),就需要用这个函数。
它长什么样?
-
Set
:表示设置(改变)某个值或状态。 -
Console
:指的是控制台,即 Windows 终端窗口。 -
Cursor
:指的是光标,在控制台中,光标表示当前输入或输出的文本位置。 -
Position
:指的是位置,即光标所在的坐标。
在代码里,SetConsoleCursorPosition 是这样的:
BOOL SetConsoleCursorPosition(HANDLE hConsoleOutput, // 屏幕的“钥匙”COORD dwCursorPosition // 光标要去的地方
);
-
HANDLE hConsoleOutput: 这是你用 GetStdHandle(STD_OUTPUT_HANDLE) 拿到的屏幕钥匙。
-
COORD dwCursorPosition: 一个坐标,告诉函数光标要去哪里。COORD 是一个小结构体,包含 X(水平位置)和 Y(垂直位置)。
-
返回值是 BOOL:成功返回 TRUE,失败返回 FALSE。
什么是 COORD?
COORD 是一个 Windows 定义的小东西,长这样:
typedef struct _COORD {SHORT X; // 横坐标(列号,从 0 开始)SHORT Y; // 纵坐标(行号,从 0 开始)
} COORD;
-
X 是列号,从左到右数(0 是最左边)。
-
Y 是行号,从上到下数(0 是最上面)。
怎么用它?
假设你想把光标移动到第 5 行、第 10 列,然后在那里写“Hello”,可以这样做:
#include <windows.h>int main() {// 1. 拿到屏幕的“钥匙”HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);if (screen == INVALID_HANDLE_VALUE) {return 1; // 钥匙坏了,退出}// 2. 设置光标要去的地方COORD position; // 准备一个坐标position.X = 10; // 第 10 列position.Y = 5; // 第 5 行// 3. 移动光标SetConsoleCursorPosition(screen, position);// 4. 在新位置写东西const char* message = "Hello";DWORD written;WriteConsoleA(screen, message, strlen(message), &written, NULL);return 0;
}
一步步解释:
-
拿到钥匙:
-
用 GetStdHandle(STD_OUTPUT_HANDLE) 拿到屏幕的钥匙,存在 screen 里。
-
-
准备坐标:
-
COORD position 是一个坐标变量。
-
position.X = 10 表示光标移到第 10 列(从左边数第 11 个位置,因为从 0 开始)。
-
position.Y = 5 表示光标移到第 5 行(从顶部数第 6 行)。
-
-
移动光标:
-
SetConsoleCursorPosition(screen, position) 用屏幕钥匙把光标送到指定位置。
-
-
写东西:
-
用 WriteConsoleA 在光标的新位置写下“Hello”。
-
运行这个程序,你会看到“Hello”出现在控制台的第 5 行、第 10 列,而不是默认的左上角。
它有什么用?
-
控制输出位置:比如你想在屏幕上画一个表格,或者让文字跳来跳去。
-
做小游戏:像贪吃蛇、俄罗斯方块这种控制台游戏,需要不停移动光标来更新画面。
-
美化界面:让你的程序看起来更有条理,而不是全挤在左上角。
跟 C++ 标准库有什么不一样?
C++ 的 std::cout 没法直接控制光标位置。如果你用 std::cout << "Hello";,文字会紧接着上一次输出的地方出现,想跳到别的地方得靠一些奇怪的办法(比如输出很多空格或换行)。而 SetConsoleCursorPosition 让你直接“遥控”光标,想去哪就去哪。
注意事项
-
屏幕大小:
-
控制台有边界(默认可能是 80 列 × 25 行,具体看你的设置)。如果 X 或 Y 超出范围,函数会失败。
-
比如,设 position.X = 100 而你的屏幕只有 80 列,就会出错。
-
-
检查返回值:
-
最好检查一下是否成功:
-
if (!SetConsoleCursorPosition(screen, position)) {return 1; // 出错了
}
3.光标不会自动回来:
-
移动光标后,下次输出会从新位置开始,不会自动回到左上角。
再试一个有趣的例子
我们让光标跳来跳去,写几个单词:
#include <windows.h>int main() {HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);if (screen == INVALID_HANDLE_VALUE) {return 1;}COORD pos;DWORD written;// 在 (5, 2) 写 "Top"pos.X = 5; pos.Y = 2;SetConsoleCursorPosition(screen, pos);WriteConsoleA(screen, "Top", 3, &written, NULL);// 在 (10, 5) 写 "Middle"pos.X = 10; pos.Y = 5;SetConsoleCursorPosition(screen, pos);WriteConsoleA(screen, "Middle", 6, &written, NULL);// 在 (2, 8) 写 "Bottom"pos.X = 2; pos.Y = 8;SetConsoleCursorPosition(screen, pos);WriteConsoleA(screen, "Bottom", 6, &written, NULL);return 0;
}
运行后,你会看到“Top”、“Middle”、“Bottom”出现在控制台的不同位置,像个小布局。
相关文章:
Windows控制台函数:移动光标位置函数SetConsoleCursorPosition()
目录 什么是 SetConsoleCursorPosition? 它长什么样? 什么是 COORD? 怎么用它? 它有什么用? 跟 C 标准库有什么不一样? 注意事项 再试一个有趣的例子 什么是 SetConsoleCursorPosition?…...
MyBatis-Plus 注解大全
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 MyBatis-Plus 注解大全 MyBatis-Plus 是基于 MyBatis 的增强工具,通过注解简化了单表 CRUD 操作和复杂查询的配置。以下是常用注解的分类及详细说…...

Redis基础之基础概念
NoSQL数据库的优点 1.直接减少CPU与IO压力,是直接通过内存来读取的 2.可以直接作为缓存使用,减少IO操作 如果我们在请求中需要来传递数据,使用NoSQL可以来进行数据的直接存储和读取,从而来减少CPU与IO压力 或者是如果一些数据较为…...

Django小白级开发入门
1、Django概述 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。 Django 框架的核心组件有: 用于创建模型的对象关系映射为最终用户设计较好的管理界面URL 设计设计者友好的模板…...
热图回归(Heatmap Regression)
热图回归(Heatmap Regression)是一种常用于关键点估计任务的方法,特别是在人体姿态估计中。它的基本思想是通过生成热图来表示某个关键点在图像中出现的概率或强度。以下是热图回归的主要特点和工作原理: 主要特点 热图表示: 每个关键点对应一个热图,热图中的每个像素值…...

SpringSecurity认证授权完整流程
SpringSecurity认证流程:loadUserByUsername()方法内部实现。 实现步骤: 构建一个自定义的service接口,实现SpringSecurity的UserDetailService接口。建一个service实现类,实现此loadUserByUsername方法。…...

MongoDB用户管理和复制组
用户管理 1、建用户时,use到的库就是此用户的验证库 2、登录时必须明确指定验证库才能登录 3、通常管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库 4、如果直接登录到数据库,不进行use(示例ÿ…...
【Android】setText调用导致的悬浮窗抖动问题
在Android13中,有这么一个bug,写一个可以拖到的悬浮窗,这个悬浮窗里有TextView,在拖到某个位置后,再调用TextView的setText方法,会发现出现了一个窗口动画,悬浮窗跳到了起始位置,从开…...
【从零开始学习计算机科学】数字逻辑(四)数字系统设计
【从零开始学习计算机科学】数字逻辑(四)数字系统设计 数字系统设计硬件描述语言 HDL(Hardware Description Language)Verilog HDL 的起源与发展HDL 软核、固核和硬核的重用HDL 的应用数字系统设计实现数字系统设计 一个数字集成电路的可以从不同的层次(系统级、算法级、…...

QT 作业 C++ day5
作业 代码 MyQThread.h class MyThread : public QThread {Q_OBJECT public:MyThread(QObject *parent nullptr); protected:void run() override; signals://向ui界面发送的 "复制进度" 的信号void copy_process_signal(int index); public slots:// "复…...
洛谷 P2234:[HNOI2002] 营业额统计 ← STL set
【题目来源】 https://www.luogu.com.cn/problem/P2234 【题目描述】 Tiger 最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger 拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析…...

植物神经功能紊乱检查不出来,浑身难受?
植物神经功能紊乱,又称为自主神经功能失调,是一种功能性神经症,它涉及身体多个系统的不规则反应,通常没有器质性病变作为基础。这意味着,尽管患者可能会体验到多种症状,如焦虑、紧张、心悸、疲劳、失眠等&a…...

vue3 遇到babel问题(exports is not defined) 解决方案
由于我在引用ant-design-vue插件,于是产生了下图的问题。 1.问题分析 Babel 是一个 JavaScript 编译器,主要用于:将 ES6 代码转译为 ES5 代码,以兼容旧版浏览器。处理模块化语法(如 import/export)。 2.解…...

基于SpringBoot+Vue的工商局商家管理系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

ESP8266 入门(第 2 部分):使用 AT 命令
使用 AT 命令对 WiFi 收发器ESP8266编程 本教程是上一个教程 ESP8266 入门(第 1 部分)的延续。因此,简单回顾一下,在之前的教程中,我们介绍了 ESP 模块,并学习了一些基础知识。我们还使用 FTDI 串行适配器模块制作了一个开发板,该模块可以很容易地用于使用 AT 命令和 A…...

【CSS3】筑基篇
目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…...

11-Agent中配置自己的插件
目录 关键词 摘要 速览 配置和集成自定义插件 使用AI插件在直播间绘制图像 API接口调用及配置说明 创建和配置API工具以生成图像 编写和配置参数及API调用说明 如何配置和使用API进行HTTP请求 配置和测试API插件的步骤 思维导图 发言总结 要点回顾 如何配置一个专…...

2025-03-08 学习记录--C/C++-PTA 习题10-1 判断满足条件的三位数
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 裁判测试程序样例: #include <stdio.h> #include <math.h>int search( int n );int…...

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性
INFINI Labs 产品更新发布!此次更新,Easysearch 增加了新的功能和数据类型,包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持,Console 新增了日志查询功能。 INFINI Easyse…...
关于网络数通工程师 OSPF 协议的常见面试问题
基础理论部分 OSPF是什么?其核心设计目标及主要特性有哪些? OSPF(开放式最短路径优先)是基于链路状态的内部网关协议(IGP),使用Dijkstra的SPF算法计算最短路径树,核心目标包括…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...