如何解决在C ++中编写控制台的问题
我刚开始学习c ++,我想使用控制台缓冲区写入控制台。这是我的代码(其中一半以上是从我正在学习的视频中复制的)
#include <iostream>
using namespace std;
#include <vector>
#include <Windows.h>
int screenWidth = 500;
int screenHeight = 500;
int main()
{
wchar_t* window = new wchar_t[screenWidth * screenHeight];
HANDLE console = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,NULL,CONSOLE_TEXTMODE_BUFFER,NULL);
SetConsoleActiveScreenBuffer(console);
DWORD dwBytesWritten = 0;
while (true)
{
window[1] = 'a';
window[screenWidth * screenHeight - 1] = '\0';
WriteConsoleOutputCharacter(console,window,screenWidth * screenHeight,{ 0,0 },&dwBytesWritten);
}
}
当我运行代码时,a
会根据需要打印到第二个索引的控制台中,但是由于某种原因,其余部分都被问号覆盖。另外,我收到以下警告,但我不知道这意味着什么:
Severity Code Description Project File Line Suppression State
Warning C6386 Buffer overrun while writing to 'window': the writable size is 'int screenWidth*int
screenHeight*2' bytes,but '4' bytes might be written. learn
C:\USERS\THEAPPLE\SOURCE\REPOS\LEARN\LEARN\SOURCE.CPP 19
解决方法
回复:“警告仅消失了一小会儿,现在又回来了”-如果不更改代码,警告就不会这样做。
请共享确实导致此警告的版本。
请参阅: https://docs.microsoft.com/en-us/cpp/code-quality/c6386?view=vs-2019
看来您可能正在做
window[screenWidth * screenHeight] = '\0';
此外,当您将尺寸明确传递给0
时,您可能不需要将最后一个字符设置为WriteConsoleOutputCharacter
。
最后,由于使用wchar_t
,因此应使用L""
文字:
window[1] = L'a';
,
根据提示信息:
在写入“窗口”时警告C6386缓冲区溢出:可写 大小为'int screenWidth int screenHeight 2'字节,但可能为'4'字节 被写。
可以发现警告的原因是您分配的动态内存是变量,并且编译器无法确定变量int screenWidth*int screenHeight*2
是否大于4 bytes
。
有一些消除此警告的方法,例如:
//change the int screenWidth to const int
const int screenWidth = 500;
const int screenHeight = 500;
当然,您也可以直接指定大小,但这可能无法满足您的要求。
如果可以确保分配的动态内存大于写入的字节数,并且内存分配成功,则实际上可以忽略此警告。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。