首页 文章

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

提问于
浏览
2

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

$ ./test 
23
s=23
0

这是我的测试程序:

#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));
  }
}

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

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

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

2 回答

  • 5

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

    要读入 wchar_t 数组,您需要 %ls . 此外,是否应使用 wscanf() scanf() 主要取决于输入的编码方式,而不是您要扫描其内容的数据类型 .

  • 4

    您的问题是 wscanf 格式 .

    MAN所述:

    s匹配一系列非空白宽字符 . [...]应用程序应确保相应的参数是一个指向大小足以接受序列和终止空字符的字符数组的指针,该字符应自动添加 .

    只需"%s"必须用于非宽字符串,如 printfscanf 中通常那样等等

    MAN还说:

    l(ell)指定以下d,i,o,u,x,X或n转换说明符适用于类型指针为long或unsigned long的参数; [...]后面的c,s或[转换说明符适用于带有指向wchar_t的类型指针的参数 .

    这意味着您必须使用 "%ls" 作为格式字符串来读取宽字符串 .

    如果您使用POSIX.NET MSDN,则可以使用另一个 non-standard ISO C 解决方案:可以使用格式 "%S" .

相关问题