c - 导致调试错误的_setmode函数

时间:2015-11-24 23:15:28

标签: c windows qt

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

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

  • 文本:

    Debug Assertion失败!

    程序: ... KOUT-Desktop_Qt_5_5_0_MSVC2013_64bit-调试\调试\ 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 ++编译器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;
}

执行时会出现错误。

1 个答案:

答案 0 :(得分: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 解决您的问题,它也可能不是最佳解决方案。