c++ - 如何将 `CString` 转换为 `CHAR *` ?

标签 c++ c-strings

我有以下 C++ 代码:

#include "stdafx.h"
#include <atlstr.h>

int _tmain(int argc, _TCHAR* argv[])
{
    CString OFST_PATH;
    TCHAR DIR_PATH[MAX_PATH];

    GetCurrentDirectory(MAX_PATH, DIR_PATH);

    OFST_PATH.Format(DIR_PATH);

    CHAR *pOFST_PATH = (LPSTR)(LPCTSTR)OFST_PATH;

    return 0;
}

我想明白为什么程序末尾pOFST_PATH的值为“c”? (LPSTR)(LPCTSTR) 变量 OFST_PATH 的转换对写入其中的整个路径做了什么?

正如您在以下窗口中看到的,调试时变量值是:

enter image description here

最佳答案

CStringLPCTSTR都基于 TCHAR ,即 wchar_t什么时候UNICODE已定义(在您的情况下,我可以通过调试器中 argv 的值判断)。当您这样做时:

(LPCTSTR)OFST_PATH

这没问题,因为 CString有一个到 LPCTSTR 的转换运算符.但是用UNICODE定义,LPCTSTRLPCWSTR ,又名 wchar_t const* .它指向一个 utf16 字符数组。该数组中的第一个字符是 L'c' (这是 'c' 的宽字符版本)。 L'c' 的字节数在内存中看起来像这样:0x63 0x00 .这是字母“c”的 ASCII 代码,后跟一个零。因此,当您转换 CStringLPCTSTR ,这是有效的,但是,您的下一次转化:

(LPSTR)(LPCTSTR)OFST_PATH

那是无效的。 LPSTRchar* , 所以你正在治疗 wchar_t const*就好像它是一个 char* .那么你的调试器假设当它看到一个 char* ,它正在查看以空字符结尾的窄字符串。如果您还记得上面第一个字符的字节值是什么,它就是字母“c”的 ASCII 值,后跟一个零。因此调试器将其视为仅由字母“c”组成的空终止字符串。

这个故事的寓意是,如果您不了解它们的作用以及它们是否合适,请不要使用 C 风格的转换。

关于c++ - 如何将 `CString` 转换为 `CHAR *` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37908311/

相关文章:

c++ - VTK 工具包 - vtkCutter 性能

c - 指向单引号字符串的字符指针数组打印字符串的最后 4 个字节

c++ - 无效转换 const unsigned char

c++ - 如何向 lambda 函数添​​加属性?

c++ - 从 C/C++ 中的函数返回不带静态整数的数组指针

c++ - Visual Studio 不允许省略默认参数?

winapi - 解释 App Verifier 输出 : Heap corruption or misinterpreting stack address as heap address?

c++ - 在 C 字符串 C++ 中收集最大和最小数字

c - 为什么在写入使用字符串初始化的 "char *s"时会出现段错误,而不是 "char s[]"?

c - 使用变量定义字符串大小在 C 的 for 循环中无法正常工作