将使用wscanf读取的宽字符串转换为C中的整数

Ant*_*oy' 2 c string integer type-conversion

我试图将使用wscanf的字符串读取转换为使用wcstol的整数,两者都来自Linux上的头文件wchar.h.虽然wcstol在常量宽字符串(例如L"23")上工作,但它对wscanf输入无效,这让我很困惑.我总是得到0,即使输入实际上是数字(例如23).为什么?

$ ./test 
23
s=23
0
Run Code Online (Sandbox Code Playgroud)

这是我的测试程序:

#include <stdio.h>
#include <wchar.h>
int main() {
  wchar_t s[100];
  if (wscanf(L"%s", s) == 1) {
    wprintf(L"s=%s\n", s);
    wprintf(L"%ld\n", wcstol(s, NULL, 10));
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用strtol而不是wcstol,它可以工作,但我得到这个警告:

/usr/include/stdlib.h:183:17:注意:预期'const char*restrict'但参数类型为'wchar_t*{aka int*}'

我可以使用类型演员沉默.我认为wcstol是将宽字符串解析为整数的正确方法.因为我的机器上的字符实际上是整数,所以strtol恰好起作用,但这让我仍然不确定这是否是正确的解决方案.这里发生了什么?为什么wcstol没有做好自己的工作?

Joh*_*ger 5

你的问题是wscanf()格式.字%s段描述符指定一个指针char,就像scanf().这两个函数在转换输入方面略有不同,但它们对字段描述符的含义达成一致.

对于读入数组wchar_t,你想要的%ls.另外,你是否应该使用wscanf()scanf()是主要的输入是如何编码,功能没有到要扫描其内容的数据类型.