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

标签 c string integer type-conversion

我正在尝试将使用 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 读取的宽字符字符串转换为 C 中的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36602890/

相关文章:

c - 单独使用递归构建最小堆

arrays - 检查并仅从字符串数组中获取 Int

php - 为什么使用 php 将 0 而不是空格插入我的数据库?

c - 将函数的地址获取到C中的结构中

python - 将 Django 的模板引擎移植到 C

c - JNI 将 CallObjectMethod 的结果转换为 unsigned short

带有绑定(bind)变量的字符串截断匹配表达式

c - C语言中如何切换字符串?

java - 从数组返回流作为 int[] 而不是 Integer[]

c - 使用整数值作为哈希表的键有多愚蠢?