我试图将使用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 回答
你的问题是
wscanf()
格式 .%s
字段描述符指定一个指向char
的指针,就像scanf()
一样 . 这两个函数在转换输入方面略有不同,但它们对字段描述符的含义一致 .要读入
wchar_t
数组,您需要%ls
. 此外,是否应使用wscanf()
scanf()
主要取决于输入的编码方式,而不是您要扫描其内容的数据类型 .您的问题是
wscanf
格式 .如MAN所述:
只需"%s"必须用于非宽字符串,如
printf
,scanf
中通常那样等等MAN还说:
这意味着您必须使用
"%ls"
作为格式字符串来读取宽字符串 .如果您使用POSIX或.NET MSDN,则可以使用另一个 non-standard ISO C 解决方案:可以使用格式
"%S"
.