2011-02-18 70 views
2

從CString接口,顯然不應該假設CString是空終止的。但是,似乎有時在字符串的末尾有一個空字符。 是否有可能,在Windows實現,創建一個CString,做有一個空字符,使閱讀一個字符過去字符串的結尾是在尋找一個不同的堆對象?CString是否始終以null結尾?

+0

你想做什麼? – 2011-02-18 15:13:31

回答

0

是,CString的總是空終止。

的文檔指出,你可以投一個CString到LPCTSTR,LPCTSTR和是的typedef之一:
__nullterminated CONST WCHAR *
__nullterminated CONST CHAR *
取決於UNICODE是否定義或沒有。

0

演員到LPCTSTR將提供一個null結尾的字符串,但不能保證該字符串的是,轉換之前空值終止。它可以很容易地終止函數內的字符串。

的CString的來源是由微軟提供,以確保是看那裏,看看事情究竟是如何實現的最佳途徑。當然,它可以在下一個版本中改變 - CString多年來發生了不少變化。

1

一個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接口。

相關問題