Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将使用wscanf读取的宽字符串转换为C中的整数_C_String_Integer_Type Conversion - Fatal编程技术网

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

将使用wscanf读取的宽字符串转换为C中的整数,c,string,integer,type-conversion,C,String,Integer,Type Conversion,我正在尝试使用wscanf将读取的字符串转换为使用wcstol的整数,这两种格式都来自Linux上的头文件wchar.h。虽然wcstol可以处理常量宽字符字符串(例如L“23”),但它不能处理wscanf输入,这让我感到困惑。我总是得到0,即使输入实际上是数字(例如23)。为什么? 这是我的测试程序: #include <stdio.h> #include <wchar.h> int main() { wchar_t s[100]; if (wscanf(L"%

我正在尝试使用wscanf将读取的字符串转换为使用wcstol的整数,这两种格式都来自Linux上的头文件wchar.h。虽然wcstol可以处理常量宽字符字符串(例如L“23”),但它不能处理wscanf输入,这让我感到困惑。我总是得到0,即使输入实际上是数字(例如23)。为什么?

这是我的测试程序:

#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));
  }
}
#包括
#包括
int main(){
wchar_t s[100];
如果(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\u t*{aka int*}”


我可以使用类型转换使其静音。我认为wcstol是将宽字符字符串解析为整数的正确方法。因为在我的机器上,字符实际上是int,strtol恰好可以工作,但这让我仍然不确定这是否是正确的解决方案。这是怎么回事?为什么wcstol没有完成它的工作?

您的问题是wscanf的
格式

如上所述:

s

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

printf
scanf
等中的常见情况一样,非宽字符字符串必须使用简单的“%s”

还说:

l(厄尔)

指定以下d、i、o、u、x、x或n转换说明符应用于类型指针指向long或unsigned long的参数;[…]下面的c、s或[转换说明符应用于类型指针指向wchar\u t的参数

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


如果您处于on或on状态,还有另一种非标准ISO C解决方案:可以使用格式
“%S”

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


要读入
wchar\u t
数组,您需要
%ls
。此外,您是否应该使用
scanf()的
wscanf()
主要是一个输入编码方式的函数,而不是要扫描其内容的数据类型。

没有大写的
S
类型说明符。这可能是一个非标准扩展。@Olaf已启用并支持它。可能,但这可能是C11或C99之前的遗留版本。最好使用最常用的标准,即C.@Olaf,LPs,值得一提的是,do文档
%s
确实是
%ls
的同义词。他们还明确地将其标记为标准C的扩展。@JohnBollinger:我刚刚看到下一个问题弹出:“为什么
%s
不起作用”。当然没有这么清楚的描述。有很多非POSIX系统(和非Windows或OS-X)在野外。问题是评论不太常被阅读(它们被谷歌索引了吗?)。不管怎样,让我们解决这个问题,LPs似乎没有心情澄清,公认的答案很清楚。。。
#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));
  }
}