繁体   English   中英

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

[英]convert wide-character string read with wscanf to an integer in C

我试图将使用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没有做好自己的工作?

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

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

你的问题是wscanf格式。

MAN所述

小号

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

简单地说,“%s”必须用于非宽字符串,就像在printfscanf等中一样

MAN还说:

l(ell)

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

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

如果您使用POSIX.NET MSDN,还有另一种非标准ISO C解决方案:可以使用格式"%S"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM