在LPCTSTR上附加一个号码

时间:2013-02-11 23:20:39

标签: c string winapi

如何将数字附加到LPCTSTR?我正在使用的库使用LPCTSTR作为com端口地址。我知道如何使用char *来实现这一点,但不知道如何使用LPCTSTR。这就是我想要做的事情(假设sprintf与这些一起工作,我知道它没有)

LPCTSTR PortString;
int ComPortNumber;

sprintf(PortString,"COM%d",ComPortNumber);

这样,当完成此操作时,如果9存储在ComPortNumber整数中,则LPCTSTR PortString将包含“COM9”。

7 个答案:

答案 0 :(得分:3)

您可以使用tchar.h中的安全版本。

TCHAR PortString[32];
int ComPortNumber;

_stprintf_s( PortString, 32, _T("COM%d"), ComPortNumber );

http://msdn.microsoft.com/en-us/library/ce3zzk1k%28VS.80%29.aspx

答案 1 :(得分:2)

使用LPCTSTR的API将该参数声明为常量字符串,以指示它不会修改它给定的字符串。您仍然可以将非常量字符串传递给此API。

所以你可以这样做:

CHAR PortString[32];
int ComPortNumber;

sprintf(PortString,"COM%d",ComPortNumber);

答案 2 :(得分:1)

LPCTSTR是指向TCHAR的指针 - 换句话说是指向字符串的指针。在您提供的代码段中,它指向一些随机的内存区域,并且运行代码是未定义的行为,因为您通过取消引用未初始化的指针来访问某些随机内存区域。

请尝试使用此代码:

TCHAR PortString[64];
int ComPortNumber;

/* assign some value to ComPortNumber here */

_sntprintf_s(
    PortString,                       // The buffer for the output
    sizeof(PortString)/sizeof(TCHAR), // The number of TCHARs in the buffer
    _TRUNCATE,                        // How to handle overflows
    _T("COM%d"),                      // The format string
    ComPortNumber);                   // And the port number, finally!

我使用调用和类型的T变体来确保您的代码可以在ANSI / MBCS和UNICODE模式下编译,以及_sntprintf的新“安全”变体来帮助减少缓冲区溢出的可能性。

在实际生产代码中,您应该检查_sntprintf_s调用错误的返回地址。

最后一点:小心PortString返回给调用此函数的人,因为它是基于堆栈的,当此函数退出时,缓冲区将消失。如果你这样做,你的程序会在你调试/测试时崩溃,如果你很幸运的话。如果你不幸运,它可能出现以正常工作,但它将是一个滴答作响的定时炸弹。

答案 3 :(得分:0)

LPCTSTR仅仅是const TCHAR *,您在接受它作为参数时会使用它。

您可能希望将字符串分配为数组。另外,使用通用文本映射:

TCHAR PortString[20];
int ComPortNumber;

_stprintf(PortString,_T("COM%d"),ComPortNumber);

并包含tchar.h。

答案 4 :(得分:0)

如果你真的想使用TCHAR东西:

使用_stprintf填充TCHAR缓冲区,该缓冲区应为数组:

TCHAR PortString[32]; /* as another answer says */

答案 5 :(得分:0)

您可以创建一个CString,然后当您完成所有内容添加后,您可以调用其上的CString::operator LPCSTR() const 从中获取LPCSTR

答案 6 :(得分:0)

LPCTSTR是const char *或const wchar_t *的typedef。就像使用char *一样,但使用_stprintf