有没有人知道如何将char数组转换为c?
中的LPCTSTR编辑:
有关更多参考,我需要在字符串中添加一个整数,然后将该字符串转换为LPCTSTR,以获取Windows函数CreateFile()的第一个参数。
这是我目前正在使用的硬编码示例,但我需要能够传入任何数字以用作端口号。
CreateFile(_T("\\\\.\\COM11")... //hardcoded for com port 11
以下是我尝试过的几件事,我相信这篇文章的下两个答案包括以下建议。不幸的是,他们没有工作。如果有人能指出我做错了什么并且可能解决我的问题,我会很感激。
所有这些示例都假设portNum是一个已经分配了有效值的int
char portName[12] = { 0 };
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );
CreateFile(portName...
我还尝试过使用LPCSTR案例的#1来获得它的价值......
LPCSTR SomeFunction(LPCSTR aString) {
return aString;
}
main() {
char portName[12] = { 0 };
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );
LPCSTR lpPortName = SomeFunction(portName);
CreateFile(lpPortName...
const char * portName = "";
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );
LPCSTR lpPortName = portName;
CreateFile(lpPortName...
答案 0 :(得分:34)
您可以隐式地将char数组转换为LPCSTR
而不进行任何强制转换:
void SomeFunction(LPCSTR aString);
...
char myArray[] = "hello, world!";
SomeFunction(myArray);
LPCSTR
是指向常量字符串的长指针的Windows typedef。回到Win16编程的黑暗时代,有不同类型的指针: near 指针和 far 指针,有时也称为 short 和<分别是em> long 指针。近指针只能指向由x86段寄存器之一确定的64KB内存段。远指针可以指向任何东西。现在在带虚拟内存的Win32中,不需要近指针 - 所有指针都很长。
因此,LPSTR
是char *
的typedef或指向字符串的指针。 LPCSTR
是const
版本,即它是const char *
的typedef。在C中,数组衰减为指向其第一个元素的指针,因此char[]
衰变为char*
。最后,任何类型的“指向T的指针”(对于任何类型T)都可以隐式转换为“指向const T的指针”。因此,结合这三个事实,我们发现我们可以隐式地将char[]
转换为LPCSTR
。
为了回应你的编辑,我猜你正在编译一个Unicode应用程序。如果仔细查看documentation for CreateFile()
,您会注意到filename参数实际上是LPCTSTR
,而不是LPCSTR
(请注意T
)。
对于几乎每个Win32函数都采用某种字符串类型的参数(可能是间接的,即作为参数传递的结构的成员),实际上有两个版本的函数:一个采用8位ANSI字符串,以及一个16位宽字符串的字符串。要获取实际的函数名称,请在函数名称后附加A
或W
。因此,CreateFile()
的ANSI版本名为CreateFileA()
,宽字符版本名为CreateFileW()
。根据您是否使用Unicode进行编译(即是否定义了预处理器符号_UNICODE
),符号CreateFile
为#define
d为CreateFileA
或{ {1}}视情况而定,同样适用于具有ANSI和宽字符版本的每个其他函数。
同样,CreateFileW
类型TCHAR
为typedef
或char
,具体取决于是否启用了Unicode,wchar_t
是LPCTSTR
转到指向typedef
的指针。
因此,为了使您的代码更正,您应该使用const TCHAR
字符串替换您正在使用的字符串,并使用类型通用版本的TCHAR
,sprintf_s
:
_stprintf_s
或者,您可以明确使用所有内容的ANSI或宽字符版本:
TCHAR portName[32];
_stprintf_s(portName, sizeof(portName)/sizeof(TCHAR), _T("\\\\.\\COM%d"), portNum);
CreateFile(portName, ...);
答案 1 :(得分:3)
你的char数组采用什么格式?
是const char[]
还是非const?
LPCSTR只是(有些)令人困惑的微软名称“长指针到常量字符串”。
LPCSTR bar = "hello";
const char *foo = bar;
const char *evil = "hello";
LPCSTR sauron = evil;
如果需要获取非const版本,则要么丢弃constness,要么复制到新数组。我可能更喜欢后者。变量通常是const的原因,改变它们几乎总是不好的做法。
答案 2 :(得分:2)
尝试这样.........
TCHAR *pcCommPort = TEXT("COM1");
HANDLE h = CreateFile(pcCommPort,other arguments);
答案 3 :(得分:1)
你有TCHAR的字符串函数。例如,您可以使用stprintf_s接受TCHAR。这样,您就可以使代码与unicode或多字节字符集“独立”。
您的代码(变体1)变为:
TCHAR portName[12] = { 0 };
stprintf_s( portName, sizeof( portName ) / sizeof(TCHAR), _T("\\\\.\\COM%i"), portNum );
CreateFile(portName...
答案 4 :(得分:0)
“有人知道如何在c中将char数组转换为LPCSTR吗?”
您根本不需要做任何事情。它会自动转换为该类型(初始值设定项和sizeof除外)。
“的CreateFile(PORTNAME ...”
也许你应该告诉我们VC ++在编译时给你的错误信息?
也许你还应该告诉我们当亚当罗森菲尔德的whcar_t版本不适合你的时候VC ++给你的错误信息是什么?
答案 5 :(得分:0)
我不确定你最后是否想出了什么,但是我遇到了同样的问题并且效果很好:
int comPortNum = 5;
char comPortName[32];
sprintf((LPTSTR)comPortName, TEXT("\\\\.\\COM%d"), comPortNum);
HANDLE h = CreateFile(comPortName,other arguments);
答案 6 :(得分:0)
char* filename;
LPCTSTR ime = CA2W(filename);
这是字符串转换宏,适用于我的VS12
答案 7 :(得分:0)
这是一个古老的经典问题。我在UNICODE中使用它。
char *pChar = "My Caption of My application";
WCHAR wsz[512];
swprintf(wsz, L"%S", pChar);
SetWindowText(hWnd, // ウィンドウまたはコントロールのハンドル
wsz // タイトルまたはテキスト
);