Windows控制臺函數:控制臺輸出函數WriteConsoleA()

目錄

什么是 WriteConsoleA?

函數簽名

參數詳解

返回值

一個最簡單的例子

跟 ReadConsoleA 對比

再試一個有趣的例子

為什么傳地址給 lpNumberOfCharsWritten?

注意事項

什么是 WriteConsoleA?

WriteConsoleA 是一個 Windows API 函數,用來把文字寫到控制臺屏幕上。就像你在 C++ 用 std::cout 輸出東西,但它是直接跟 Windows 的控制臺打交道。

把它想象成一個“送信員”:

  • 你給它一堆信(文字)和一個地址(屏幕的鑰匙),它就幫你把信送到屏幕上。

  • 它是 ReadConsoleA 的反向操作:ReadConsoleA 是收信,WriteConsoleA 是送信。

函數簽名

它的完整定義是:

BOOL WriteConsoleA(HANDLE hConsoleOutput,         // 屏幕的“鑰匙”const VOID* lpBuffer,          // 要送的“信”DWORD nNumberOfCharsToWrite,   // 信有多少字符LPDWORD lpNumberOfCharsWritten,// 記錄實際送了多少LPVOID lpReserved              // 不用,寫 NULL
);

看起來有點像 ReadConsoleA,對吧?我一個個拆開講。?

參數詳解

1. HANDLE hConsoleOutput - 屏幕的“鑰匙”

  • 這是什么:你用 GetStdHandle(STD_OUTPUT_HANDLE) 拿到的屏幕句柄。

  • 作用:告訴 WriteConsoleA:“我要往屏幕上送東西。”

  • 怎么用:

HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
  • 就像你告訴送信員:“用這個鑰匙打開屏幕的信箱。”

2. const VOID* lpBuffer - 要送的“信”

  • 這是什么:你要輸出的文字,通常是一個 const char* 字符串。

  • 作用:這是送信員要送出去的內容。

  • 怎么用:

const char* message = "Hello";
  • 想象這是你要寄出去的信,內容是“Hello”。VOID* 表示它可以是任何類型,但我們用 char 就夠了。

3. DWORD nNumberOfCharsToWrite - 信有多少字符

  • 這是什么:一個數字,告訴函數“信里有多少字符要送”。

  • 作用:讓送信員知道要送多長一段文字。

  • 怎么用:

    • 如果 message 是“Hello”,就寫 5(或者用 strlen(message))。

    • 比如:

DWORD length = strlen(message); // 5
  • 這就像告訴送信員:“這封信有 5 個字,別漏了。”

4. LPDWORD lpNumberOfCharsWritten - 記錄實際送了多少

  • 這是什么:一個變量的地址,函數會把“實際送出去多少字符”寫在這里。

  • 作用:告訴你送信員成功送了多少。

  • 怎么用:

DWORD how_many_written; // 定義一個變量

然后傳地址:?

&how_many_written
  • 跟 ReadConsoleA 的 lpNumberOfCharsRead 一樣,送信員會記下:“我送了 5 個字符。”

?

為什么傳地址給 lpNumberOfCharsWritten?

跟 ReadConsoleA 的 lpNumberOfCharsRead 一樣:

  • 函數需要修改 how_many_written,告訴你實際寫了多少字符。

  • 傳地址(&how_many_written)讓函數直接改這個變量。

  • 如果不傳地址,函數改不了外面的值。

?

5. LPVOID lpReserved - 不用,寫 NULL

  • 這是什么:一個預留參數,微軟留著以后可能用。

  • 作用:現在沒用。

  • 怎么用:

NULL
  • 就像告訴送信員:“沒啥特別要求,正常送就行。”

返回值

  • 返回 BOOL(TRUE 或 FALSE):

    • TRUE:送信成功。

    • FALSE:出錯了(比如屏幕鑰匙壞了)。

一個最簡單的例子

我們寫個程序,在屏幕上顯示“Hello”:

#include <windows.h>
#include <cstring>int main() {// 1. 拿到屏幕鑰匙HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);if (screen == INVALID_HANDLE_VALUE) {return 1; // 鑰匙壞了,退出}// 2. 準備信和計數器const char* message = "Hello";    // 要送的信DWORD how_many_written;           // 記錄送了多少// 3. 發送信(寫到屏幕)WriteConsoleA(screen, message, strlen(message), &how_many_written, NULL);return 0;
}

運行過程:

  1. 拿到鑰匙:GetStdHandle(STD_OUTPUT_HANDLE) 給你屏幕的鑰匙。

  2. 準備信:

    • message 是“Hello”,長度是 5。

    • how_many_written 是計數器。

  3. 送信:

    • WriteConsoleA 把“Hello”送到屏幕上。

    • how_many_written 變成 5,表示送了 5 個字符。

運行結果:屏幕上顯示“Hello”。

跟 ReadConsoleA 對比

參數

ReadConsoleA

WriteConsoleA

第一個

鍵盤鑰匙(輸入)

屏幕鑰匙(輸出)

第二個

箱子(收信)

信(送信)

第三個

最多收多少字符

要送多少字符

第四個

記錄實際收了多少(地址)

記錄實際送了多少(地址)

第五個

控制選項(NULL)

預留(NULL)

  • ReadConsoleA 是從鍵盤“收”東西到程序里。

  • WriteConsoleA 是從程序“送”東西到屏幕上。

再試一個有趣的例子

我們結合 SetConsoleCursorPosition,在不同位置寫文字:

#include <windows.h>
#include <cstring>int main() {HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);if (screen == INVALID_HANDLE_VALUE) {return 1;}DWORD how_many_written;COORD pos;// 在 (5, 2) 寫 "Hi"pos.X = 5; pos.Y = 2;SetConsoleCursorPosition(screen, pos);const char* msg1 = "Hi";WriteConsoleA(screen, msg1, strlen(msg1), &how_many_written, NULL);// 在 (10, 5) 寫 "There"pos.X = 10; pos.Y = 5;SetConsoleCursorPosition(screen, pos);const char* msg2 = "There";WriteConsoleA(screen, msg2, strlen(msg2), &how_many_written, NULL);return 0;
}

注意事項

  1. 字符數:

    • nNumberOfCharsToWrite 必須匹配 lpBuffer 的長度,不然可能出錯。

    • 用 strlen 確保準確。

  2. 換行:

    • 如果想換行,得在字符串里加 \n,比如 "Hello\n"。

  3. 檢查返回值:

if (!WriteConsoleA(screen, message, strlen(message), &how_many_written, NULL)) {return 1; // 出錯了
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72831.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72831.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72831.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【貪心算法】將數組和減半的最小操作數

1.題目解析 2208. 將數組和減半的最少操作次數 - 力扣&#xff08;LeetCode&#xff09; 2.講解算法原理 使用當前數組中最大的數將它減半&#xff0c;&#xff0c;直到數組和減小到一半為止&#xff0c;從而快速達到目的 重點是找到最大數&#xff0c;可以采用大根堆快速達到…

Prompt engineering設計原則

目錄 一、清晰具體的prompt1. 使用分隔符2. 結構化的輸出&#xff08;JSON&#xff09;3. 要求模型檢查是否滿足條件4. 提供少量案例 二、給模型時間去思考1.指定完成任務所需的步驟2. 指導模型在下結論之前找出一個自己的解法 一、清晰具體的prompt 一個合理的prompt設計決定…

Vue 過濾器 filter(s) 的使用

即過濾器是用來格式化數據的一個函數。過濾器不會修改原始數據&#xff0c;它的作用是過濾數據&#xff0c;就是對數據進行加工處理并返回處理后的數據&#xff0c;比如做一些數據格式上的修改&#xff0c;狀態轉換等。 過濾器分為兩種 組件內的過濾器(組件內有效) 全局過濾器…

ESP8266UDP透傳

1. 配置 WiFi 模式 ATCWMODE3 // softAPstation mode 響應 : OK 2. PC 連?入 ESP8266 softAP 就是連接wifi 3.查詢ESP8266設備的IP地址 ATCIFSR 響應: CIFSR: APIP, "192.168.4.1" CIFSR: APMAC, "1a: fe: 34: a5:8d: c6" CIFSR: STAIP, "192.…

高效運行 QwQ-32B + 錯誤修復

文章目錄 QwQ-32B 錯誤修復?? 官方推薦設置&#x1f44d; 推薦的 llama.cpp 設置&#x1f4d6; 教程&#xff1a;運行和修復的 QwQ-32B1、對于 llama.cpp 及使用 llama.cpp 的引擎&#xff1a;2、下載模型 測試3、測試/評估4、嘗試不使用我們的修復方案&#xff1a; &#x…

Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). )

Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). ) 題目大意&#xff1a; 在這個交互式問題中&#xff0c;你需要通過查詢系統&#xff0c;逐步找出隱藏的位字符串 S。給定一個偶數 n&#xff0c;表示目標位字符串 S 的長度&#xff0c;你需要通…

Leetcode 刷題記錄 06 —— 矩陣

本系列為筆者的 Leetcode 刷題記錄&#xff0c;順序為 Hot 100 題官方順序&#xff0c;根據標簽命名&#xff0c;記錄筆者總結的做題思路&#xff0c;附部分代碼解釋和疑問解答。 目錄 01 矩陣置零 方法一&#xff1a;標記數組 方法二&#xff1a;兩個標記變量 02 螺旋矩陣…

Java【網絡原理】(3)網絡編程續

目錄 1.前言 2.正文 2.1ServerSocket類 2.2Socket類 2.3Tcp回顯服務器 2.3.1TcpEchoServer 2.3.2TcpEchoClient 3.小結 1.前言 哈嘍大家好&#xff0c;今天繼續進行計算機網絡的初階學習&#xff0c;今天學習的是tcp回顯服務器的實現&#xff0c;正文開始 2.正文 在…

C++11新特性 8.final關鍵字、override關鍵字

一.final 用法&#xff1a; 1.修飾函數 只能修飾虛函數&#xff0c;阻止子類重寫這個函數&#xff0c;final關鍵字寫在函數名的后面。 即該虛函數不可以再被重寫。 注意&#xff1a;一般不會在基類中使用&#xff0c;不然沒有意義&#xff0c;因為只能修飾虛函數。 2.修飾…

Python實現網絡通信:Socket模塊與TCP/IP協議全解析

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

click house擴容方案

《ClickHouse擴容方案解析》 當我們談論數據庫的時候&#xff0c;尤其是像ClickHouse這樣專為處理大規模數據分析而設計的列式存儲數據庫時&#xff0c;擴容是一個不可避免的話題。隨著數據量的增長和查詢復雜度的提升&#xff0c;原有的硬件資源可能不足以支撐高效的查詢響應…

【AGI】智譜開源2025:一場AI技術民主化的革命正在到來

智譜開源2025&#xff1a;一場AI技術民主化的革命正在到來 引言&#xff1a;開源&#xff0c;一場技術平權的革命一、CogView4&#xff1a;中文AI生成的里程碑1. 破解漢字生成的“AI魔咒”2. 開源協議與生態賦能 二、AutoGLM&#xff1a;人機交互的范式躍遷1. 自然語言驅動的跨…

java8中young gc的垃圾回收器選型,您了解嘛

在 Java 8 的 Young GC&#xff08;新生代垃圾回收&#xff09;場景中&#xff0c;對于 ToC的場景&#xff0c;即需要盡可能減少垃圾回收停頓時間以滿足業務響應要求的場景&#xff0c;以下幾種收集器各有特點&#xff0c;通常 Parnew和 G1 young表現較為出色&#xff0c;下面詳…

【數學 矩陣快速冪】P7108 移花接木|普及+

本文涉及知識點 數學 移花接木 題目背景 遙遠的圣地生長著一棵不為人知的靈樹&#xff0c;或有萬山之高。 但有一日&#xff0c;藏匿于根系的腐朽力量爆發&#xff0c;靈樹已無法支撐往日屹立沖天的高度。 題目描述 靈樹最初的形態可以看作一棵高度為 10 10 10 10 {10}…

2025-03-09 學習記錄--C/C++-PTA 習題10-7 十進制轉換二進制

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 裁判測試程序樣例&#xff1a; #include <stdio.h>void dectobin( int n );int main() {int n;scanf(…

前端 | CORS 跨域問題解決

問題&#xff1a;Access to fetch at http://localhost:3000/save from origin http://localhost:5174 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the request…

fastapi房產銷售系統

說明&#xff1a; 我希望用fastapi寫幾個接口&#xff0c;查詢房產交易系統的幾條數據&#xff0c;然后在postman里面測試 查詢客戶所有預約記錄&#xff08;含房源信息&#xff09;需要對應銷售經理查詢客戶所有訂單&#xff08;含房源信息&#xff09;統計銷售經理名下所有房…

導軌式ARM工業控制器:組態軟件平臺的“神經中樞”

工業自動化領域&#xff0c;組態軟件平臺扮演著至關重要的角色。它不僅是工業控制系統的“大腦”&#xff0c;更是實現智能化、高效化生產的關鍵工具。而作為組態軟件平臺的硬件支撐&#xff0c;導軌式ARM工控機&#xff08;以下簡稱“工控機”&#xff09;憑借其緊湊的設計、強…

每日一題——矩陣置零問題的原地算法

矩陣置零問題的原地算法 問題描述示例約束條件進階要求 問題分析難點分析解題思路 代碼實現代碼說明 測試用例測試用例 1測試用例 2測試用例 3 總結 問題描述 給定一個 m x n 的矩陣&#xff0c;如果矩陣中的某個元素為 0&#xff0c;則需要將其所在的行和列的所有元素都置為 …

Springboot中的@Value注解:用法與潛在問題探索

在Spring Boot開發中&#xff0c;有個非常實用的注解&#xff0c;那就是Value&#xff01;它可以幫助我們輕松地從配置文件中讀取屬性值。想象一下&#xff0c;在應用程序中管理各種配置&#xff0c;比如數據庫連接信息、服務URL或者API密鑰等&#xff0c;使用Value是多么方便呀…