当前位置: 首页 > news >正文

Windows控制台函数:控制台读取输入函数ReadConsoleA()

目录

什么是 ReadConsoleA?

它长什么样?

怎么用它?

它跟 std::cin 有什么不一样?

注意事项

什么是 ReadConsoleA?

ReadConsoleA 是一个 Windows API 函数,用来从控制台读取用户输入。想象一下,你用 GetStdHandle(STD_INPUT_HANDLE) 拿到了键盘的“钥匙”,现在你需要一个工具来“打开键盘的门”,读取用户敲进去的文字——这个工具就是 ReadConsoleA。

它的全称是 "Read Console A",其中的 "A" 表示该函数是以 ANSI(美国国家标准协会编码)格式读取数据的版本。 

  • Read":表示这是一个读取操作。

  • "Console":表示操作的是控制台(Console),即命令行界面(CLI)。

  • "A":表示函数的参数是以 ANSI 格式进行编码的。Windows 为字符串处理提供了两个版本的 API:一个是以 ANSI 字符集(单字节字符)处理字符串,另一个是以 Unicode 字符集(双字节字符)处理字符串。以 "A" 结尾的函数(例如 ReadConsoleA)使用 ANSI 编码,"W" 结尾的函数(例如 ReadConsoleW)使用 Unicode 编码。

它有点像 C++ 的 std::cin,但更底层,直接跟 Windows 系统打交道。

它长什么样?

在代码里,ReadConsoleA 的样子是这样的:

BOOL ReadConsoleA(HANDLE hConsoleInput,   // 键盘的“钥匙”LPVOID lpBuffer,        // 放输入的“箱子”DWORD nNumberOfCharsToRead, // 箱子最多装多少字符LPDWORD lpNumberOfCharsRead, // 记录实际装了多少LPVOID pInputControl    // 先不管,写 NULL
);

别被这些参数吓到,我一个个解释:

  • HANDLE hConsoleInput: 这是你用 GetStdHandle(STD_INPUT_HANDLE) 拿到的键盘钥匙。

  • LPVOID lpBuffer: 一个“箱子”,用来装用户输入的文字。可以用 char 数组代替。

  • DWORD nNumberOfCharsToRead: 告诉函数“我的箱子最多能装多少字符”,防止装不下。

  • LPDWORD lpNumberOfCharsRead: 一个变量的地址,函数会把“实际装了多少字符”写在这里。

  • LPVOID pInputControl: 一个高级选项,我们暂时用不到,直接写 NULL。

返回的是 BOOL(真/假),成功返回 TRUE,失败返回 FALSE。

怎么用它?

假设你想让用户输入一些文字,然后把这些文字存起来,我们可以这样写:

#include <windows.h>int main() {// 1. 拿到键盘的“钥匙”HANDLE keyboard = GetStdHandle(STD_INPUT_HANDLE);if (keyboard == INVALID_HANDLE_VALUE) {return 1; // 钥匙坏了,退出}// 2. 准备一个箱子装输入char box[100]; // 最多装 100 个字符DWORD how_many_read; // 记录实际读了多少// 3. 用钥匙开门,读取输入ReadConsoleA(keyboard, box, 100, &how_many_read, NULL);// 4. 在箱子里加个结束标志box[how_many_read - 2] = '\0'; // 去掉回车换行// 5. 把箱子里的东西显示出来HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);WriteConsoleA(screen, box, strlen(box), &how_many_read, NULL);return 0;
}

一步步解释:

  1. 拿到钥匙:

    • 用 GetStdHandle(STD_INPUT_HANDLE) 拿到键盘的钥匙,存在 keyboard 里。

  2. 准备箱子:

    • char box[100] 是一个数组,就像一个能装 100 个字符的箱子。

    • DWORD how_many_read 是一个计数器,记录实际读了多少。

  3. 读取输入:

    • ReadConsoleA 用键盘钥匙“开门”,等着用户输入文字。

    • 用户输入完后按 Enter,文字就装进 box 里,how_many_read 会告诉你装了多少字符。

  4. 处理箱子:

    • 用户按 Enter 时,输入会多出两个字符(回车 \r 和换行 \n),所以我们减掉它们,把 box 变成普通字符串。

  5. 显示结果:

    • 用 WriteConsoleA 把 box 里的内容输出到屏幕上。

运行这个程序,你可以输入一些文字(比如“Hi”),按 Enter 后,屏幕会显示“Hi”。

它跟 std::cin 有什么不一样?

  • std::cin 是 C++ 的高级工具,简单好用:

std::string text;
std::cin >> text;
  • 但它只读到空格就停了,而且你没法控制细节。

  • ReadConsoleA 更底层:

    • 它会读整行(直到用户按 Enter)。

    • 你可以用它做更复杂的事,比如读取特殊按键(需要额外设置)。

注意事项

  1. 箱子大小:

    • 如果用户输入超过 100 个字符(box 的大小),程序可能会出问题。所以 nNumberOfCharsToRead 要跟箱子大小匹配。

  2. 回车换行:

    • ReadConsoleA 会把 \r\n(回车和换行)也读进来,how_many_read 会包括这两个字符。所以我们用 box[how_many_read - 2] = '\0' 把它们去掉。

  3. 检查成功:

    • 最好检查 ReadConsoleA 的返回值:

if (!ReadConsoleA(keyboard, box, 100, &how_many_read, NULL)) {return 1; // 出错了
}

相关文章:

Windows控制台函数:控制台读取输入函数ReadConsoleA()

目录 什么是 ReadConsoleA&#xff1f; 它长什么样&#xff1f; 怎么用它&#xff1f; 它跟 std::cin 有什么不一样&#xff1f; 注意事项 什么是 ReadConsoleA&#xff1f; ReadConsoleA 是一个 Windows API 函数&#xff0c;用来从控制台读取用户输入。想象一下&#…...

奇安信 2025 年护网蓝队初选笔试题(附答案解析)

&#x1f525; 爆款 CSDN 题库 | 超全护网蓝队笔试真题 | 含详细答案解析 &#x1f525; 熬夜为大家整理了 奇安信 2025 年护网蓝队初选笔试题&#xff0c;&#xff08;关注我我会持续更新&#xff09;涵盖 SQL 注入、Web 安全、渗透测试、二进制安全 等核心知识点&#xff0c;…...

国产编辑器EverEdit - Web预览设置

1 设置-高级-Web预览 1.1 设置说明 选择主菜单工具 -> 设置 -> 常规&#xff0c;在弹出的选项窗口中选择Web预览分类&#xff0c;如下图所示&#xff1a; 1.1.1 本地浏览HTML文件 如果用户只是在本地浏览HTML文件&#xff0c;即直接用浏览器打开HTML文件&#xff0c;确…...

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 or Set--lower_bound()的解法!!!

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 题目 并查集解析代码【并查集解】 Set 解法解析lower_bound代码 题目 并查集解析 首先先让所有的f&#xff08;i&#xff09;i&#xff0c;即每个人最开始的祖先都是自己&#xff0c;然后就每一次都让轮到那个数的父亲1&#xff08…...

HTML 编辑器推荐与 VS Code 使用教程

在进行 HTML 编程时&#xff0c;选择一款合适的 HTML 编辑器能极大地提高开发效率。以下为大家推荐几款常用且功能强大的 HTML 编辑器&#xff0c;同时详细介绍如何使用 VS Code 创建和预览 HTML 文件。 一、HTML 编辑器推荐 VS Code&#xff1a;由微软开发&#xff0c;是一款…...

MyBatis增删改查:静态与动态SQL语句拼接及SQL注入问题解析

MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。本文将深入探讨 MyBatis 中的增删改查操作&#xff0c;重点讲解静态与动态 SQL 语句的拼接&#xff0c;并分析 S…...

在运维工作中,Lvs、nginx、haproxy工作原理分别是什么?

在运维工作中&#xff0c;LVS、NGINX和HAProxy都是常用的负载均衡和反向代理工具&#xff0c;它们在高可用性和负载均衡场景中发挥重要作用。以下是其原理和应用场景详解&#xff1a; LVS&#xff08;Linux Virtual Server&#xff09; 工作原理 LVS是基于Linux内核的负载均…...

linux学习(五)(服务器审查,正常运行时间负载,身份验证日志,正在运行的服务,评估可用内存)

服务器审查 在 Linux 中审查服务器的过程包括评估服务器的性能、安全性和配置&#xff0c;以确定需要改进的领域或任何潜在问题。审查的范围可以包括检查安全增强功能、检查日志文件、审查用户帐户、分析服务器的网络配置以及检查其软件版本。 Linux 以其稳定性和安全性而闻名…...

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一&#xff1a;海量数据的分布式计算 场景二&#xff1a;实时决策的毫秒级响应 场景三&#xff1a;弹性扩展与容错机制 技术隐喻&#xff1a; 二、车载信息系统&#xff08;IVI&#xff09;的交互 场景一&#xff1a;Android Automo…...

开发环境搭建-02.后端环境搭建-熟悉项目结构

一.后端环境搭建...

js实现pdf文件路径预览和下载

预览 直接浏览器窗口打开默认就是预览 window.open(文件路径)下载 function downloadPDF(url, filename) {fetch(url).then(response > response.blob()).then(blob > {const link document.createElement(a);link.href URL.createObjectURL(blob);link.download fi…...

【RAG】基于向量检索的 RAG (BGE示例)

RAG机器人 结构体 文本向量化: 使用 BGE 模型将文档和查询编码为向量。 &#xff08;BGE 是专为检索任务优化的开源 Embedding 模型&#xff0c;除了本文API调用&#xff0c;也可以通过Hugging Face 本地部署BGE 开源模型&#xff09; 向量检索: 从数据库中找到与查询相关的文…...

Vue源码解析之mustache模板引擎

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

python: DDD using postgeSQL and SQL Server

postgreSQL 注意&#xff1a; # psycopg 2 驱动的连接字符串 #engine create_engine(postgresql://post:geovindulocalhost:5433/TechnologyGame) #Session sessionmaker(bindengine)# 使用 psycopg3 驱动的连接字符串 #engine create_engine(postgresqlpsycopg://user:g…...

Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF

基于PyMuPDF与百度翻译的PDF翻译处理系统开发:中文乱码解决方案与自动化排版实践 一 、功能预览:将英文翻译为中文后创建的PDF 二、完整代码 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle...

IntelliJ IDEA 2021版创建springboot项目的五种方式

第一种方式&#xff0c;通过https://start.spring.io作为spring Initializr的url来创建项目。 第二种方式&#xff0c;通过https://start.spring.io官网来直接创建springboot项目压缩包&#xff0c;然后导入至我们的idea中。 点击generate后&#xff0c;即可生成压缩包&#xf…...

c#面试题整理6

1.String类能否被继承&#xff0c;为什么 可以看到String类的修饰符是sealed&#xff0c;即是密封类&#xff0c;故不可被继承 2.一个对象的方法是否只能由一个线程访问 不是&#xff0c;但是可通过同步机制&#xff0c;确保同一个时间只有一个线程访问 3.计算2*8&#xff…...

跟着 Lua 5.1 官方参考文档学习 Lua (12)

文章目录 5.7 – Input and Output Facilities补充内容io.input ([file])io.read ()io.write ()io.output ([file])io.lines ([filename])io.flush ()io.close ([file])io.open (filename [, mode])io.popen (prog [, mode])io.tmpfile ()io.type (ob)file:read ()file:lines (…...

大语言模型中的归一化技术:LayerNorm与RMSNorm的深入研究

在LLama等大规模Transformer架构的语言模型中&#xff0c;归一化模块是构建网络稳定性的关键组件。本文将系统分析归一化技术的必要性&#xff0c;并详细阐述为何原始Transformer架构中的LayerNorm在LLama模型中被RMSNorm所替代的技术原理。 归一化技术的基础原理 归一化的核…...

nodejs使用WebSocket实现聊天效果

在nodejs中使用WebSocket实现聊天效果&#xff08;简易实现&#xff09; 安装 npm i ws 实现 创建 server.js /*** 创建一个 WebSocket 服务器&#xff0c;监听指定端口&#xff0c;并处理客户端连接和消息。** param {Object} WebSocket - 引入的 WebSocket 模块&#xff0c…...

用.NET 6+和secs4net快速搭建半导体设备通信主机(附完整代码示例)

基于.NET 6与secs4net构建半导体设备通信主机的实战指南 在半导体制造领域&#xff0c;设备间的高效通信是自动化生产线的核心需求。SECS/GEM协议作为行业标准&#xff0c;为设备与主机系统间的数据交换提供了可靠框架。本文将展示如何利用.NET 6平台和secs4net库快速搭建功能完…...

[Python3高阶编程] - 异步编程深度学习指南一: 基础知识( 源代码)

异步编程深度学习指南 原文: https://blog.csdn.net/andylin02/article/details/159649164?spm1001.2014.3001.5502 #!/home/admin/.pyenv/versions/3.9.12/bin/python # -*- coding: utf-8 -*-o import aiohttp import asyncio from asyncio import Semaphoreasync def fetc…...

B2B战略到营销分解实战:OGSM / 主题 / 内容 / 渠道 / 节奏五层框架

# B2B战略到营销分解实战&#xff1a;OGSM / 主题 / 内容 / 渠道 / 节奏五层框架先给结论&#xff1a;很多B2B企业真正缺的不是动作&#xff0c;而是把战略翻译成可协同、可执行、可复盘的年度经营结构。## 一、定义 B2B战略到营销分解是什么&#xff1a;把品牌战略中的目标客户…...

大模型岗位大盘点!小白也能快速上手的5大方向,速来抄作业!

作者参加春招宣讲会后&#xff0c;对大模型岗位产生兴趣&#xff0c;但因自身条件感到迷茫。文章详细盘点了大模型相关岗位&#xff0c;包括核心算法、应用算法、系统与基建、数据与评测、工程开发、产品与运营六大类&#xff0c;并分析了各岗位的职责与要求。作者建议小白可从…...

别再只调包了!用Sentence-Transformers从零训练你的专属Embedding模型(附完整代码)

从零构建领域专属Embedding模型&#xff1a;超越调包侠的实战指南 当你第一次调用model.encode("你的文本")就能获得一个语义向量时&#xff0c;是否好奇过这个黑箱背后的魔法&#xff1f;在电商推荐、智能客服等垂直场景中&#xff0c;通用Embedding模型的表现往往差…...

一天一个开源项目(第59篇):Dream Recorder - 用 AI 把梦境变成视频的物理设备

引言 “Record your dreams. Wake up. Speak. Watch them come to life.” 这是「一天一个开源项目」系列的第 59 篇文章。今天介绍的项目是 Dream Recorder&#xff08;GitHub&#xff09;。 想把梦境变成可回放的视频&#xff1f;Dream Recorder 是 Modem 开源的物理梦境记录…...

罗技鼠标宏压枪脚本:绝地求生精准射击的终极解决方案

罗技鼠标宏压枪脚本&#xff1a;绝地求生精准射击的终极解决方案 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中的后坐力控…...

IDEA插件实战:CodeGeeX4不只是补全代码,这5个隐藏用法让效率翻倍

IDEA插件实战&#xff1a;CodeGeeX4不只是补全代码&#xff0c;这5个隐藏用法让效率翻倍 在JetBrains生态中&#xff0c;AI编程助手早已不是新鲜事物&#xff0c;但大多数开发者对CodeGeeX4的认知仍停留在"智能补全"层面。当我在团队内部做技术分享时&#xff0c;发现…...

Fay数字人框架全攻略:从技术原理到商业落地的完整实践指南

Fay数字人框架全攻略&#xff1a;从技术原理到商业落地的完整实践指南 【免费下载链接】Fay Fay 是一个开源的数字人类框架&#xff0c;集成了语言模型和数字字符。它为各种应用程序提供零售、助手和代理版本&#xff0c;如虚拟购物指南、广播公司、助理、服务员、教师以及基于…...

对于对话中的对话状态跟踪,OpenClaw 的跨领域迁移能力?

在讨论对话状态跟踪这个问题时&#xff0c;OpenClaw 的跨领域迁移能力其实是一个挺有意思的切入点。很多人在初次接触这个概念时&#xff0c;可能会觉得这不过是另一个模型在多个数据集上跑出来的结果&#xff0c;但真正深入去看&#xff0c;会发现背后有不少值得琢磨的地方。 …...