c - _setmode 函数导致调试错误

Posted

技术标签:

【中文标题】c - _setmode 函数导致调试错误【英文标题】:c - _setmode function causing debug error 【发布时间】:2015-11-24 23:15:27 【问题描述】:

好的,所以在发布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++ 文档。

(按重试调试应用程序)

截图:

如果没有_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;

执行时出现错误。

【问题讨论】:

也许您可以发布一个显示问题的最小、完整的程序? 添加示例代码! 在我的情况下,当我发现我在像你一样调用 _setmode 之后仍然调用 cout 而不是 wcout 时,它停止了它。更改为 wcout,断言错误消失了。 【参考方案1】:

看来如果你把输出模式设置为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确实解决了您的问题,它也可能不是最好的解决方案。

【讨论】:

它不起作用,因为程序输出错误而不管它上面发生了什么。我尝试寻找编码但没有取得任何进展,我只是在 IDE 上搞砸了一些文件的表示。 您可以试试我刚刚添加到答案中的代码吗?它对我来说很好,当然我的字体不包含西里尔字符,所以我只得到问号。 (但看起来你原来的问题已经解决了,关于另一个问题?) 它没有用。正如我所说,无论代码上发生了什么,这行都会导致错误。我接受了另一个问题的答案,因为它作为问题的根源是有道理的,但它仍然没有解决它。我想我会回到解决方法。 我只能假设 Qt 正在做一些奇怪的事情,因为在正常的应用程序中代码可以工作。

以上是关于c - _setmode 函数导致调试错误的主要内容,如果未能解决你的问题,请参考以下文章

_mm256_load_ps 在调试模式下导致 google/benchmark 出现分段错误

AVAudioSession - 捕获 setMode 和 setCategory 错误

C++ 编译错误记录

C++ 编译错误记录

C++ 编译错误记录

std::unordered_map 不断导致错误,这是一个错误吗?