从CString接口,显然不应该假设CString是空终止的。但是,似乎有时在字符串的末尾有一个空字符。 是否有可能,在Windows实现,创建一个CString,做不有一个空字符,使阅读一个字符过去字符串的结尾是在寻找一个不同的堆对象?CString是否始终以null结尾?
回答
看看这里的MSDN文档:
http://msdn.microsoft.com/es-es/library/awkwbzyc(v=vs.80).aspx
基础上,我会想有一个空终止那里你只需要做一些铸造得到它。
是,CString的总是空终止。
的文档指出,你可以投一个CString到LPCTSTR,LPCTSTR和是的typedef之一:
__nullterminated CONST WCHAR *
__nullterminated CONST CHAR *
取决于UNICODE是否定义或没有。
演员到LPCTSTR
将提供一个null结尾的字符串,但不能保证该字符串的是,转换之前空值终止。它可以很容易地终止函数内的字符串。
的CString的来源是由微软提供,以确保是看那里,看看事情究竟是如何实现的最佳途径。当然,它可以在下一个版本中改变 - CString多年来发生了不少变化。
一个CString
更像是一个Visual Basic字符串或BSTR
。它可以在CString的数据部分包含嵌入的二进制零。但是,当使用各种运算符在CString
和标准C型零终止字符串之间进行转换时,嵌入式二进制零将被视为字符串字符的结尾。所以一个CString
就像一个BSTR
类型的变量。
比如我把下面的源代码行成一个MFC项目,并在Visual Studio C++调试运行它。
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
至于去下一个堆对象,我不会依赖于此。实现CString
关于对象如何布置在内存中以及它如何使用内存。如果你创建一个CString
,可能会分配一个大小为64个字符的缓冲区,而不管你输入了多少个字符。 CString
提供了GetLength()
方法来确定CString
中应该使用多少个字符。还有获取和设置特定字符位置的方法。
CString
旨在允许程序员像在Visual Basic类型的字符串中一样思考字符串,而不必处理C样式字符串,这些字符串是真正的字符数组,具有字符串终止符字符的特殊结尾,二进制零。
Edit01 - 在CString的编译参数和效果
在Visual Studio编译器以前到Visual Studio 2013允许CString
类来创建或者8位多字节字符集或16位的Unicode字符串取决于是否处理源文件时定义_MBCS或_UNICODE。
我之前说过的Visual Studio 2013的原因是,似乎现在不推荐使用_MBCS(另请参阅Side-effect of deprecation of MBCS support for MFC in VS 2013)。
的这种灵活性的根是TCHAR
定义其可以是char
如果_MBCS被定义或wchar_t
如果_UNICODE定义。这反过来决定了_T()
或TEXT()
宏会发生什么情况,该宏会将引用的字符串转换为char
类型的数组或类型的数组,其中L
用于指示wchar_t
文本字符串。这也会影响LPCTSTR
(指向const TCHAR
字符串的指针)或LPTSTR
(指向非const TCHAR
字符串的指针)的实际类型。
与Windows NT/2000/XP一样,Windows 95/98/ME在Windows API中没有对UNICODE的本地支持,因此允许选择UNICODE以将Windows NT或MBCS作为目标Windows 95是有帮助的。当时的另一个选择是用于Unicode的Microsoft Layer,它为Windows 95/98/ME的Windows API提供了一个UNICODE接口。
- 1. 我可以检查一个字符串是否以null结尾,但不检查它是否以NULL结尾
- 2. .net终结器是否始终执行?
- 3. 如何指示Grails始终创建以斜线(/)结尾的URL:?
- 4. 始终确保文本编辑器以X文本结尾
- 5. 表单'提交'按钮始终以错误结尾
- 6. INotifyPropertyChanged.PropertyChanged始终为NULL
- 7. 目录路径变量是否应以尾部斜线结尾?
- 8. 是否始终生成myAssembly.xmlSerializer.dll?
- 9. 是否始终需要ACL?
- 10. 删除尾部NULL终止符
- 11. LocationServices.FusedLocationApi.getLastLocation始终返回null
- 12. getParameters始终返回null
- 13. iOS SecTrustRef始终为NULL
- 14. HttpContext.GetGlobalResourceObject始终返回null
- 15. EVP_get_cipherbyname始终返回null
- 16. Session_Start中Cookie始终为NULL
- 17. Graphics2D始终返回“NULL”
- 18. AVAudioPlayer isPlaying始终返回null
- 19. 是否DataReader.NextResult检索结果始终是相同的顺序
- 20. Angular 1 UI-Router - HTML5模式参数URL始终以正斜杠结尾
- 21. Famo.us - Gridlayout是否始终是Gridlayout?
- 22. 获取SWT StyledText小部件始终滚动到其结尾
- 23. Web浏览器是否始终在域名后面发送尾部斜线?
- 24. INDEX MATCH结果始终是相同的
- 25. Window.getComputedStyle()的结果始终是最新的?
- 26. cPickle.dump始终在文件末尾倾销
- 27. 如何检查线程是否以Python结尾
- 28. 如何判断变量是否不以连字符结尾?
- 29. 检查字符串是否以vbcrlf开头或结尾
- 30. 检查数字是否以.00结尾使用php
你想做什么? – 2011-02-18 15:13:31