由chatgpt生成,彩笔修改并完善ing。
先这样,以后再改

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
int y,x;
printf("dvdsvdsvd\n");
printf("2592626huby 9498\n");
printf(" 2592626huby 9498\n");
// 获取标准输出句柄
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
// 获取控制台窗口信息
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hStdout, &csbi);
// 计算控制台窗口缓冲区的大小
int bufferSize = csbi.dwSize.X * csbi.dwSize.Y;
// 调整缓冲区的大小
CHAR_INFO* buffer = (CHAR_INFO*) malloc(bufferSize * sizeof(CHAR_INFO));
if (buffer == NULL) {
printf("Error: failed to allocate memory.\n");
return 1;
}
// 读取控制台窗口中的文本
COORD bufferCoord = {0, 0};
SMALL_RECT readRegion = {0, 0, csbi.dwSize.X - 1, csbi.dwSize.Y - 1};
ReadConsoleOutput(hStdout, buffer, csbi.dwSize, bufferCoord, &readRegion);
// 输出读取到的文本
for (y = 0; y < csbi.dwSize.Y; y++) {
int isEmptyLine = 1; // 默认为是空行
for (x = 0; x < csbi.dwSize.X; x++) {
char c = buffer[x + y * csbi.dwSize.X].Char.AsciiChar;
char* lineStart = &buffer[y * csbi.dwSize.X];
if (c != ' ') {
isEmptyLine = 0; // 如果该行有非空字符,说明不是空行
}
}
for (x = 0; x < csbi.dwSize.X; x++)
if (!isEmptyLine) {
// 只有不是空行才输出换行符
for (x = 0; x < csbi.dwSize.X; x++){
char c = buffer[x + y * csbi.dwSize.X].Char.AsciiChar;
printf("%c",c);
}
printf("\n");
}
}
free(buffer);
return 0;
}
typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
COORD dwSize;//COORD 结构,包含控制台屏幕缓冲区的大小(以字符列和行表示)。
COORD dwCursorPosition;//包含控制台屏幕缓冲区中光标的列坐标和行坐标。
WORD wAttributes;
//由 WriteFile 和 WriteConsole 函数写入屏幕缓冲区或由 ReadFile 和 ReadConsole 函数回显到屏幕缓冲区的字符的属性。
SMALL_RECT srWindow;//其中包含显示窗口左上角和右下角的控制台屏幕缓冲区坐标。
COORD dwMaximumWindowSize;//其中包含控制台窗口的最大大小(以字符列和行表示,给定当前屏幕缓冲区大小和字体以及屏幕大小)。
} CONSOLE_SCREEN_BUFFER_INFO;
typedef struct _COORD {
SHORT X; // horizontal coordinate
SHORT Y; // vertical coordinate
} COORD;
HANDLE是指向内核对象的指针或者句柄。
该代码示例展示了如何使用WindowsAPI函数获取控制台的标准输出句柄,读取并处理控制台缓冲区的内容,包括检查和打印非空行。它涉及到内存分配、控制台屏幕缓冲区信息的获取以及字符属性。
473

被折叠的 条评论
为什么被折叠?



