【问题标题】:Console showing end of string character显示字符串结尾字符的控制台
【发布时间】:2021-01-13 12:34:08
【问题描述】:

我只是在搞乱 CPP 和 Windows 控制台。我需要更改我拥有的屏幕缓冲区的特定部分,但它总是打印我想要的字符串加上一个空方框。

有没有办法去掉这个空白框?

int screen_w = 120;
int screen_h = 30;

void init_screen(wchar_t* screen_buffer, int screen_w, int screen_h) {
    for (int i = 0; i < screen_h; ++i) {
        for (int j = 0; j < screen_w; ++j) {
            if (i != 0 && i != 2 && i != screen_h - 1 && 
                j != 0 && j != screen_w - 1) {
                screen_buffer[i * screen_w + j] = ' ';
            } else {
                screen_buffer[i * screen_w + j] = '#';
            }
        }
    }
}

int main() {
    int screen_s = screen_w * screen_h;
    
    wchar_t *screen_buffer = 0;
    screen_buffer = (wchar_t *) calloc(screen_s, sizeof *screen_buffer);
    
    HANDLE c_handle = CreateConsoleScreenBuffer(
        GENERIC_WRITE | GENERIC_READ,
        0,
        0,
        CONSOLE_TEXTMODE_BUFFER,
        0);
    SetConsoleActiveScreenBuffer(c_handle);
    DWORD bytes_written = 0;
    
    init_screen(screen_buffer, screen_w, screen_h);

    while (1) {
        Sleep(1000 / 10);
        WriteConsoleOutputCharacterW(c_handle, screen_buffer, screen_s, { 0, 0 }, &bytes_written);
        wsprintfW(&screen_buffer[15 * screen_w + 60], L"hello world"); // THIS IS WHAT I DO. 
                                                                       // TRIED OTHER SIMILAR FUNCTIONS.
        if (GetAsyncKeyState(VK_SPACE) & 0x8000) break;
    }
    free(screen_buffer = 0);
    return 0;
}

它显示了什么:

########################################################################################################################
#                                                                                                                      #
########################################################################################################################
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                           hello world▯                                               #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
#                                                                                                                      #
########################################################################################################################```

【问题讨论】:

  • 添加了,抱歉!
  • 也许这是一个控制台编码的东西?我不知道...
  • wsprintfW 将整个字符串文字复制到屏幕缓冲区中,包括 NUL 终止字符。你可能想要wmemcpy 或类似的东西——不处理以 NUL 结尾的字符串。
  • 还要注意wsprintfW 的文档说:注意不要使用....
  • Adrian Mole 我之前实际上是在使用 swprintf。还尝试了swprintf_s。总是一样的结果。

标签: c++ windows-console


【解决方案1】:

问题是您的wsprintfW() 调用(或任何sprintf 函数系列)会将(必需的)nul-终止符附加到输出缓冲区段......而这个可能 在某些平台的控制台中呈现为“奇怪”字符。

因此,与其尝试将 格式化 字符串写入缓冲区,不如使用直接内存复制例程。

下面这行 - 代替你的 wsprintf(...) 调用 - 将起到作用:

    memcpy(&screen_buffer[15 * screen_w + 60], L"hello world", wcslen(L"hello world") * sizeof(wchar_t));

但您可以使用声明的(本地)变量使代码看起来更漂亮/更简单:

    const wchar_t* text = L"hello world";
    memcpy(&screen_buffer[15 * screen_w + 60], text, wcslen(text) * sizeof(wchar_t));

【讨论】:

  • 是的,谢谢。这解决了它。但奇怪的是那个角色没有出现在我朋友的电脑上,而我的两个电脑上都出现了......哦,我想这就是解决方案
  • @void-main-void 有很多不同的地方和方法可以配置 Windows 控制台如何显示非 ASCII 字符。我认为两台不同的 PC 具有完全相同相同配置的可能性非常小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2015-09-14
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多