【发布时间】:2021-12-31 08:39:11
【问题描述】:
我正在尝试在我的程序中实现西里尔字符的输入和输出。我读了this 回答如何实现它(它在俄语上)。它说使用_setmode (_fileno (stdin), _O_U16TEXT); 应该可以很好地处理使用wscanf 或wcin 的UTF-8 字符。
这是一个不使用 _setmode 的小型 wchar 输入示例:
#include <stdio.h>
int main()
{
int input = -1;
wprintf (L"Enter a number: ");
wscanf (L"%d", &input);
wprintf (L"%d", input);
return 0;
}
输入数字时效果很好:输入数字被写入控制台。但是当我尝试使用 _setmode 时:
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main()
{
int input = -1;
_setmode(_fileno(stdin), _O_U16TEXT);
wprintf (L"Enter a number: ");
wscanf (L"%d", &input);
wprintf (L"%d", input);
return 0;
}
然后wscanf 什么都不做 - 它返回 0,并且输入变量没有改变,所以到控制台的输出总是 -1。
我不明白为什么会这样。 _fileno (stdin) 返回 0,因为它应该为标准输入做。 _setmode 返回 16384,所以它不是 -1,这应该意味着它可以正常工作。另外,我的源文件是用 UTF-8 编码的。
【问题讨论】:
-
添加
#include <io.h>会怎样? -
@AdrianMole 使用
#include <io.h>没有任何改变。我将通过我使用 C++ Code::Blocks 项目将语言标签更正为“C”(哦,你做到了,好吧),可能它包括 io.h 本身。 -
标准输入数据从何而来?管道?输入的编码是什么?
-
@Anders 对不起,如何查看输入的编码?我不确定我是否理解管道输入是什么,但我想我不会使用它,我只是将数据从键盘输入到控制台。
-
如果您使用键盘输入,则输入不会重定向(不是管道也不是文件)。这对于重现问题很重要。