【问题标题】:Appending a number to LPCTSTR将数字附加到 LPCTSTR
【发布时间】:2013-02-11 23:20:39
【问题描述】:

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

LPCTSTR PortString;
int ComPortNumber;

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

这样,当 9 存储在 ComPortNumber 整数中时,LPCTSTR PortString 将包含“COM9”。

【问题讨论】:

    标签: c string winapi


    【解决方案1】:

    您可以使用 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

    【讨论】:

      【解决方案2】:

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

      所以你可以这样做:

      CHAR PortString[32];
      int ComPortNumber;
      
      sprintf(PortString,"COM%d",ComPortNumber);
      

      【讨论】:

      • 我认为现在snprintfsprintf 更受欢迎
      • 只要确保你没有从包含这段代码的任何函数返回PortString。否则……轰隆
      • 当我尝试这个时,我得到错误:错误 C2664: 'SetupComPort' : cannot convert parameter 2 from 'CHAR [32]' to 'LPCTSTR',其中 SetupComPort 是接受一个LPCTSTR 作为参数。
      • “问题”是您使用 UNICODE 进行编译,而 LPCTSTR 是指向 wchar_t 的指针,而 CHAR 是 char - 这两种类型根本不同。 <tchar.h> 宏旨在抽象出这种差异。查看一些显示如何改用 TCHAR 的答案。
      【解决方案3】:

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

      试试这个代码:

      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返回给调用此函数的任何人,因为它是基于堆栈的,并且当此函数退出时,缓冲区将消失。如果你这样做,你的程序会在你调试/测试时崩溃,如果你幸运的话。如果你不走运,它可能看起来正常工作,但它会是一个定时炸弹。

      【讨论】:

      • 当我尝试这个时,我得到了未处理的异常:访问冲突写入位置 0x00000000。我没有返回这个字符串,(因为这部分在 Main 中,但我将它交给另一个函数来进行 Com 端口设置。
      • @Xantham:我可以向您保证上面的代码是正确的,您引用的错误不能由代码生成,如所写。您确定崩溃发生在这段代码中吗?您能向我们展示您尝试过的实际代码吗?你复制粘贴了吗?你做了什么改变吗?
      • 同意 - 如果这对您来说失败,则需要更多上下文
      • 你是对的,错误在该错误的代码中的其他地方。作为一个更普遍的问题,你是怎么知道这个答案的? sprintf 有几种不同的变体,我怎么能(不在这里在线询问)自己解决这个问题?文档中只有很小的差异,所以我不知道如何解决这个问题。
      • 嗯,简短的回答是“经验”。唯一稍微长一点的答案是“搜索 MSDN 有点加经验”。这是你偶然发现它时学到的那种东西,然后你就可以使用它。
      【解决方案4】:

      LPCTSTR 只是一个const TCHAR *,当您接受它作为参数时使用它。

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

      TCHAR PortString[20];
      int ComPortNumber;
      
      _stprintf(PortString,_T("COM%d"),ComPortNumber);
      

      并包含 tchar.h。

      【讨论】:

      • TCHAR 的重点是不知道是CHAR 还是WCHARLPSTRLPWSTR 等)。此答案不适用于活动的 _UNICODE/UNICODE 定义。
      【解决方案5】:

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

      使用_stprintf 填充TCHAR 缓冲区,该缓冲区应该是一个数组:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 请改用_sntprintf_s。字符串函数的_s 变体有助于防止错误并提高程序的安全性。
          猜你喜欢
          • 2012-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-17
          • 2016-06-11
          • 2012-10-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多