使用C ++ / CLI从C#到C ++获取结构:
public value struct SampleObject
{
LPWSTR a;
};
我想打印它的实例:
printf(sampleObject->a);
但是我收到了这个错误:
错误1错误C2664:'printf':无法转换参数1 'LPWSTR'到'const char *'
如何转换LPWSTR to char*
?
提前致谢。
答案 0 :(得分:18)
使用wcstombs()
功能,该功能位于<stdlib.h>
。以下是如何使用它:
LPWSTR wideStr = L"Some message";
char buffer[500];
// First arg is the pointer to destination char, second arg is
// the pointer to source wchar_t, last arg is the size of char buffer
wcstombs(buffer, wideStr, 500);
printf("%s", buffer);
希望这有助于某人!这个功能让我免于很多挫折。
答案 1 :(得分:5)
只需使用printf("%ls", sampleObject->a)
即可。在l
中使用%ls
表示您可以传递wchar_t[]
,例如L"Wide String"
。
(不,我不知道为什么L和W前缀一直在混合)
答案 2 :(得分:2)
int length = WideCharToMultiByte(cp, 0, sampleObject->a, -1, 0, 0, NULL, NULL);
char* output = new char[length];
WideCharToMultiByte(cp, 0, sampleObject->a, -1, output , length, NULL, NULL);
printf(output);
delete[] output;
答案 3 :(得分:0)
不要转换。
使用wprintf
代替printf
:
请参阅the examples,其中说明了如何使用它。
或者,您可以将std::wcout
用作:
wchar_t *wstr1= L"string";
LPWSTR wstr2= L"string"; //same as above
std::wcout << wstr1 << L", " << wstr2;
同样,使用专为宽字符设计的函数,并忘记将wchar_t
转换为char
的想法,因为它可能会丢失数据。
在这里查看处理wide-char的函数:
答案 4 :(得分:0)
这是一个简单的解决方案。查看wsprintf
LPWSTR wideStr = "some text";
char* resultStr = new char [wcslen(wideStr) + 1];
wsprintfA ( resultStr, "%S", wideStr);
&#34;%S&#34;将隐式地将UNICODE转换为ANSI。
答案 5 :(得分:-1)
使用WideCharToMultiByte()
方法转换多字节字符。
以下是从LPWSTR转换为char *的示例 或者性格广泛。
/*LPWSTR to char* example.c */
#include <stdio.h>
#include <windows.h>
void LPWSTR_2_CHAR(LPWSTR,LPSTR,size_t);
int main(void)
{
wchar_t w_char_str[] = {L"This is wide character string test!"};
size_t w_len = wcslen(w_char_str);
char char_str[w_len + 1];
memset(char_str,'\0',w_len * sizeof(char));
LPWSTR_2_CHAR(w_char_str,char_str,w_len);
puts(char_str);
return 0;
}
void LPWSTR_2_CHAR(LPWSTR in_char,LPSTR out_char,size_t str_len)
{
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,in_char,-1,out_char,str_len,NULL,NULL);
}