c - _setmode 函数导致调试错误

标签 c windows qt

好的,所以在发布之后 this question我尝试使用社区指出的相关问题(特别是 this )中提供的解决方案,但我遇到了另一个问题。

当尝试使用 _setmode() 函数更改 Windows 控制台以打印 UTF 字符时,出现调试错误,就像 this other question 上发布的错误一样.调试报错如下:

  • 正文:

    调试断言失败!

    程序: ...kout-Desktop_Qt_5_5_0_MSVC2013_64bit-Debug\debug\Breakout.exe 文件:f:\dd\vctools\crt\crtw32\stdio\output.c 线路:1033

    表达式:((_Stream->_flag & _IOSTRG) || ( fn = _fileno(_Stream), ( (_textmode_safe(fn) == _IOINFO_TM_ANSI) && !_tm_unicode_safe(fn))))

    有关您的程序如何导致断言失败的信息,请参阅有关断言的 Visual C++ 文档。

    (按重试调试应用程序)

  • 截图:

Debug Assert Failed

如果没有_setmode() 函数,我仍然无法打印上层ASCII 表中的字符,例如:“┌──┐”。我该怎么做才能解决这个问题?同样问题的问题的解决方案也不起作用。

同样,我在 Windows 上使用 Qt Creator,Qt 版本为 5.5.0 MSVC 64 位。编译器是 Microsoft Visual C++ Compiler 12.0 (amd64)。

  • 编辑:

这是导致错误的小示例代码:

#include <stdio.h>

#include <io.h>
#include <fcntl.h>

int main(void)
{
    //Using setmode to force the error
    _setmode(_fileno(stdout), _O_U16TEXT);

    printf("Hello World!\n");
    return 0;
}

执行时出现错误。

最佳答案

看来,如果将输出模式设置为 UTF-16,则必须使用 wprintf 而不是 printf。

(大概是因为您已经告诉运行时从 UTF-16 转换,所以您必须提供 UTF-16。)

这段代码在我的机器上运行:

#include <fcntl.h>
#include <io.h>
#include <stdio.h>

int main(void) {
    _setmode(_fileno(stdout), _O_U16TEXT);
    wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n");
    return 0;
}

也是

wprintf(L"Hello world!\n");

PS - 我不确定这是否会解决您的潜在问题,我怀疑这与源文件的编码有关。即使使用 UTF-16 确实解决了您的问题,它也可能不是最佳解决方案。

关于c - _setmode 函数导致调试错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33905670/

相关文章:

C函数变量改变

c - 如何在 CUDA 中将包含数组的结构传递给内核?

c - Mac OS X 上的 Valgrind 错误 printf a double

c# - 从 Windows 到 Linux 构建 C# 应用程序

qt - CDB 在 Qt Creator 中加载变量的速度非常慢

通过泛型指针调用 C 函数

java - java 的 fileWriter() 函数是否适用于 Linux 类型的机器?

windows - WiX——检查以前的安装

multithreading - 基本的QT事件处理/线程问题?

c++ - Qt OpengL - 旋转 3D 固定场景