您的位置:首页 > 其它

VC中关于字符串处理问题小结

2010-06-14 20:56 633 查看
在Visual C++中,对字符串的处理是编程中经常遇到的问题。笔者在实际的工作中就经常性地碰到这类问题,且常常游走于CString、char及其相互之间转换的情形当中,因笔者在C++方面也是刚刚起步,对字符串的处理还真给笔者出了不少难题。不过,借助MSDN及相关网络资源,笔者对字符串的处理渐渐熟悉起来。现在此对VC中字符串的处理做一个阶段小结。
我们都知道,在C++中处理字符串可以使用CString,可以使用string,也可以使用char*。CString是Visual C++中最常用的字符串类,string为标准模板类(STL)定义的字符串类,而char*则是C语言编程中最常用的字符串指针。在这里笔者仅仅简要总结一下CString和char*的基本使用,因当下较少使用string,故不再详述。
首先来看CString,笔者对其最经常性的一个用途就是格式化,比如将int、long、double等类型的数据转换为字符串类型,还有在输出调试信息时亦经常用到,如下面的代码所示:
// Output the debug message
CString szDebugMsg;
szDebugMsg.Format(TEXT("uiSeekSizePos: %I64u, uiStartSizePos: %I64u, uiEndSizePos: %I64u"),  uiSeekSizePos, uiStartSizePos, uiEndSizePos);
::OutputDebugString(szDebugMsg);


其次就是char*指针了,通常我们需要将多个char*拼接起来,这可以有多种方法,比如使用strcpy、strncpy可以通过复制的方式将多个字符串进行拼装,或使用strcat来连接多个字符串。而若是需要按特定的格式拼装成一个新的字符串,则可以使用sprintf函数,代码示例如下:
char* pchProtocolName = "rtsp";
char* pchIPAddress = "172.18.10.10";
char* pchFileName = "test.mp3";
unsigned int uiPort = 3001;

char* pchUrl = NULL;
char const* const chUrlFmt = "%s://%s:%d/%s";

unsigned uiUrlSize = strlen(chUrlFmt)
+ strlen(pchProtocolName)
+ strlen(pchIPAddress)
+ strlen(pchFileName)
+ sizeof(uiPort);

pchUrl = new char[uiUrlSize];

// Write formatted data to a string.
sprintf(pchUrl, chUrlFmt, pchProtocolName, pchIPAddress, uiPort, pchFileName);

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/huangxinfeng/archive/2010/06/14/5671309.aspx


此外,对于字符串常需要在字符串末尾加上“/0”,这时可以采用手动加入或调用c_str()。

在这里还需要提及的就是CString与char*指针之间的转换了。从char*指针转换为CString是非常简单的,只需直接等于其即可,如:
char* pchTest = "Hello, world!";
CString szTest;
szTest = pchTest;


而从CString转换为char*指针的话,则可以使用Format,或进行强制转换const char* pchTest = (LPCTSTR)szTest,或使用GetBuffer(int nMinBufLength)方法。需要注意的是宽字符的转换问题,代码示例如下:
CString szMainBuffer;

// Get buffer size
CHAR* pszBuffer = NULL;
int iByteSize = 0, iwcharSize = 0, iLastChar = 0;
iwcharSize = _tcslen(szMainBuffer);

iByteSize = WideCharToMultiByte(
CP_ACP,         // UINT CodePage,
NULL,           // DWORD dwFlags,
szMainBuffer,   // LPCWSTR lpWideCharStr,
iwcharSize,     // int cchWideChar,
NULL,           // LPSTR lpMultiByteStr,
0,              // int cbMultiByte,
NULL,           // LPCSTR lpDefaultChar,
NULL            // LPBOOL lpUsedDefaultChar
);

// Allocate buffer
pszBuffer = new char[ iByteSize + 1 ];
iLastChar = iByteSize;
memset( pszBuffer, '/0', iByteSize + 1 );

// Convert
WideCharToMultiByte(
CP_ACP,                     // UINT CodePage,
NULL,                       // DWORD dwFlags,
szMainBuffer,               // LPCWSTR lpWideCharStr,
iwcharSize,                 // int cchWideChar,
pszBuffer,                  // LPSTR lpMultiByteStr,
iByteSize,                  // int cbMultiByte,
NULL,                       // LPCSTR lpDefaultChar,
NULL                        // LPBOOL lpUsedDefaultChar
);

// Force NULL-terminate
pszBuffer[iLastChar] = '/0';


总之,对于VC中,无论是字符串之间的转换,还是字符串与其他数据类型之间的转换,均有非常多的系统函数或API可供使用,非常方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: