從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. BluetoothGattDescriptor始終是NULL
- 3. .net終結器是否始終執行?
- 4. 如何知道$ string是否以','結尾?
- 5. 以null結束符結尾的字符串文字是否包含額外的null結束符?
- 6. 是否std :: string :: c_str()總是返回一個以null結尾的字符串?
- 7. Chromecast Android SDK:RemoteMediaPlayer在嘗試控制時始終以IllegalStateException結尾
- 8. 表單'提交'按鈕始終以錯誤結尾
- 9. AES管理的加密值始終以==結尾?
- 10. 如何指示Grails始終創建以斜線(/)結尾的URL:?
- 11. 始終確保文本編輯器以X文本結尾
- 12. 是否可以讓WCF DataServices JSON結果始終返回camelCase?
- 13. Python字符串以NULL結尾嗎?
- 14. ctypes以NULL結尾的數組
- 15. INotifyPropertyChanged.PropertyChanged始終爲NULL
- 16. 目錄路徑變量是否應以尾部斜線結尾?
- 17. Facebook FQL用戶表中的'is_minor'列是否始終爲NULL?
- 18. XMLHttpRequest是否始終可用?
- 19. 是否始終需要ACL?
- 20. 是否始終生成myAssembly.xmlSerializer.dll?
- 21. 刪除尾部NULL終止符
- 22. iOS SecTrustRef始終爲NULL
- 23. 曲奇始終返回null
- 24. Intent.getStringExtra()始終返回null
- 25. findFragmentById始終返回null
- 26. getChildAt始終返回null
- 27. Cookie值始終返回null
- 28. LocationServices.FusedLocationApi.getLastLocation始終返回null
- 29. Wicket RadioChoice始終返回null
- 30. getParameters始終返回null
你想做什麼? – 2011-02-18 15:13:31