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