1. 程式人生 > >【語言-C++】關於CString 函式GetLength()返回值等於0

【語言-C++】關於CString 函式GetLength()返回值等於0

程式碼解讀

CString 函式GetLength()

	int GetLength() const throw()
	{
		return( GetData()->nDataLength );
	}
CString的字串長度是存在一個nDataLength(int型)的變數中,而nDataLength(int型)不是實時更新的,我們再看下面一個函式ReleaseBuffer

CString 函式ReleaseBuffer()

	void ReleaseBuffer(_In_ int nNewLength = -1)
	{
		if( nNewLength == -1 )
		{
			int nAlloc = GetData()->nAllocLength;
			nNewLength = StringLengthN( m_pszData, nAlloc);
		}
		SetLength( nNewLength );
	}
CString的ReleaseBufferbuffer函式中有一個SetLength,設定字串長度,我們再看一下SetLength函式

CString 函式SetLength(int nLength)

	void SetLength(_In_ int nLength)
	{
		ATLASSERT( nLength >= 0 );
		ATLASSERT( nLength <= GetData()->nAllocLength );

		if( nLength < 0 || nLength > GetData()->nAllocLength)
			AtlThrow(E_INVALIDARG);

		GetData()->nDataLength = nLength;
		m_pszData[nLength] = 0;
	}

可以看出在SetLength函式中,nDataLength(int型)的變數被重新附上當前字串申請空間的長度。因此可得,在使用GetLength()之前最好是使用ReleaseBuffer()強制重新整理一下nDataLength(int型)變數,避免不必要的錯誤發生。

示例:

void fun( CString str)
{
	str.ReleaseBuffer();
	if (str.GetLength() > 0)
	{
		//Do...
	}
}