Mfc CString是否总是以null结尾?

Mfc CString是否总是以null结尾?,mfc,cstring,Mfc,Cstring,从CString接口来看,显然不应该假设CString以null结尾。然而,有时似乎在字符串的末尾有一个空字符。 在Windows实现中,是否可以创建一个没有空字符的CString,这样读取字符串末尾的一个字符就是查看另一个堆对象?请在此处查看MSDN文档: 基于这一点,我猜那里有一个空终止符,你只需要做一些转换就可以得到它。是的,CString总是空终止的 文档中说明,您可以将CString强制转换为LPCTSTR,而LPCTSTR是其中一个的typedef: \uuu空终止常数WCHAR*

从CString接口来看,显然不应该假设CString以null结尾。然而,有时似乎在字符串的末尾有一个空字符。
在Windows实现中,是否可以创建一个没有空字符的CString,这样读取字符串末尾的一个字符就是查看另一个堆对象?

请在此处查看MSDN文档:


基于这一点,我猜那里有一个空终止符,你只需要做一些转换就可以得到它。

是的,CString总是空终止的

文档中说明,您可以将CString强制转换为LPCTSTR,而LPCTSTR是其中一个的typedef:
\uuu空终止常数WCHAR*

\uuu空终止常量字符*


取决于是否定义了UNICODE

转换为
LPCTSTR
将提供以null结尾的字符串,但不能保证该字符串在转换之前以null结尾。它可以很容易地终止函数中的字符串


CString的源代码是由微软提供的,确保这一点的最好方法是查看它,并确切地了解它是如何实现的。当然,它在下一个版本中总是会发生变化的-CString在过去几年中有很多变化。

CString更像是Visual Basic字符串或
BSTR
。它可以在CString的数据部分包含嵌入的二进制零。但是,当使用各种运算符在
CString
和标准C类型以零结尾的字符串之间进行转换时,嵌入的二进制零被视为字符串结尾字符。因此,
CString
非常类似于
BSTR
类型的变量

例如,我将以下源代码行放入MFC项目中,并在VisualStudioC++调试程序中运行它。

CString myString (_T("this\000is a String."));  // myString will only contain "this" as a zero terminated string.

CString myJJ;
myJJ.Format (_T("this%cisaxxx"), 0);   // this creates a string with an embedded binary zero in it.
int iLen = myJJ.GetLength();      // this returns the length of the complete string, 11 characters
CString myRight = myJJ.Right(4);  // this returns the right most 4 characters, "axxx"
TCHAR  myTbuff[64];
_tcscpy (myTbuff, myJJ);    // this copies the string up to the embedded binary zero into myTbuff
至于下一个heap对象,我并不依赖于它。对象如何在内存中布局以及如何使用内存取决于
CString
的实现。这可能是因为,如果您创建了一个
CString
,则无论您在其中输入了多少字符,都会分配一个大小为64个字符的缓冲区
CString
提供了
GetLength()
方法来确定
CString
中有多少个字符,以便使用。还有获取和设置特定角色位置的方法

CString
的设计目的是让程序员能够按照VisualBasic中的字符串类型来考虑字符串,而不必处理C风格的字符串,这些字符串实际上是带有特殊字符串结尾字符(二进制零)的字符数组

Edit01-编译器参数和对CString的影响

Visual Studio 2013之前的Visual Studio编译器允许
CString
类创建8位多字节字符集或16位UNICODE字符串,具体取决于处理源文件时是定义了_MBCS还是_UNICODE

我在Visual Studio 2013之前所说的原因是,使用MBCS现在似乎已被弃用(另请参见)

这种灵活性的根源是
TCHAR
定义,如果定义了MBCS,则可以是
char
,如果定义了UNICODE,则可以是
wchar\t
。这反过来决定了
\u T()
TEXT()
宏会发生什么情况,该宏将通过预挂起或不使用用于指示
wchar\u T
文本字符串的
L
来将带引号的字符串转换为
char
类型的数组或
wchar\u T
类型的数组。这也会影响
LPCTSTR
(指向常量
TCHAR
字符串的指针)或
LPTSTR
(指向非常量
TCHAR
字符串的指针)的实际类型


Windows 95/98/ME与Windows NT/2000/XP一样,在Windows API中没有对UNICODE的本机支持,因此,允许选择UNICODE来针对Windows NT或MBCS来针对Windows 95是有帮助的。当时的另一个选项是Microsoft Layer for Unicode,它为Windows 95/98/ME的Windows API提供了一个Unicode接口。

I其次,您的文本听起来非常混乱(特别是考虑到C字符串必须以空字节终止,才能使用该名称调用)。所以请描述一下你想做什么,以及你在做这件事时遇到了什么问题。@Tony-我有一个奇怪的腐败错误,我有一些代码正在读取字符串末尾的一个错误。我想知道他们是否有联系@DarkDust-我有一个,不是一个C字符串。你为什么不停止读取字符串末尾的一个呢?