C -传递argv[x]给函数作为wchar_t

  • 本文关键字:函数 wchar 传递 argv c
  • 更新时间 :
  • 英文 :


我想写一些代码,使用hidapi做一些USB灯。hidapi中的函数期望serial_number作为wchar_t传递,但是我的argv[]是char*

它的工作方式是硬编码SERIALNUMBER并使用wcsncpy()

wcsncpy(serial_number, L"SERIALNUMBER", MAX_STR);
dev = hid_open(0x046d, 0xc900, serial_number);

不工作的方式是将序列号作为CLI参数(例如./script SERIALNUMBER)发送,在使用函数将char*转换为wchar_t后:

void ctow(char *toConvert, wchar_t *wstr) {
int count = 0;
int len = strlen(toConvert);
for(; count < len; count++) {
wstr[count] = (wchar_t) toConvert[count];
}
}

奇怪的是,当你wprintf()的序列号,它确实出来正确。我还注意到,如果您不将L添加到硬编码序列号,它也不起作用。

这是一个更大的程序的一部分,但我已经将其缩减到仅用于故障排除的直接用例。我哪里做错了?下面是完整的代码:

#include <string.h>
#include <hidapi.h>
#define MAX_STR 255
void ctow(char *toConvert, wchar_t *wstr) {
int count = 0;
int len = strlen(toConvert);
for(; count < len; count++) {
wstr[count] = (wchar_t) toConvert[count];
}
}
int main(int argc, char* argv[])
{
wchar_t wstr[MAX_STR];
wchar_t serial_number[MAX_STR];
hid_device *dev;
// ctow(argv[1],serial_number);                     // this DOES NOT WORK

wcsncpy(serial_number, L"SERIALNUMBER", MAX_STR);   // this DOES work
dev = hid_open(0x046d, 0xc900, serial_number);
if (!dev) {
wprintf(L"Open FAILED on serial number %ls", serial_number);
}
else {
wprintf(L"Open SUCCESS on serial number %ls", serial_number);
}
return 0;
}

使用mbstowcs

char* foo = "abcdef";
wchar_t *wfoo = malloc((strlen(foo) + 1) * sizeof(wchar_t));
mbstowcs(wfoo, foo, strlen(foo) + 1);

看到en.cppreference.com/w/c/string/multibyte/mbstowcs

最新更新