Split字符串的最好方法是什么? 标准库里有没有啊?PS:上哪儿能找到比较好的标准库编程指南啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 strtoken, strstr ...多了,自己去msdn查吧。 ms-help://MS.MSDNQTR.2003FEB.1033/vclib/html/_crt_string_manipulation.htm strtok(); 不过这个需要你指定哪些字符是分隔符,而且会修改源字符串。 下面是我的做法,XStringList 是一个 String 的队列用于保存已经分出来的字符串,可以自己用其他对象代替,返回值是分出多少个字符串,例如 1,2,,3 分出的是 "1" "2" "" "3" 共四个字符串,算法并不是最优,请各位指正,int strToArglist(const char * pszStr, const char * pszToken, XStringList & arglist){ int tok_len = ::strlen(pszToken); int str_len = ::strlen(pszStr); char* tToken = new char[tok_len + 1]; char* tStr = new char[str_len + 1]; char* tmp = new char[str_len + 1]; char* p1 = tStr; char* p2 = tStr; ::ZeroMemory(tToken,tok_len + 1); ::ZeroMemory(tStr,str_len + 1); ::CopyMemory(tStr,pszStr,str_len); bool bToken = false; do { ::ZeroMemory(tmp,str_len + 1); p2 = ::_tcsstr(p1,pszToken); if (p1 == p2) { } if ((p2 != NULL && p1 == tStr) || *p1 != 0x00 || (p2 == NULL && bToken && *p1 == 0x00)) { if (p2 == NULL) ::CopyMemory(tmp,p1,::strlen(p1)); else ::CopyMemory(tmp,p1,p2-p1); XString * pstr = new XString; *pstr = tmp; arglist.PushItem(pstr); bToken = true; } if (p2 != NULL) p1 = p2 + tok_len; } while(p2 != NULL); delete [] tToken; delete [] tStr; delete [] tmp; return arglist.Size();} 用Mid Find ReverseFind left等函数编一个不行吗? 我觉得还是自己写好。因为那些函数往往只能顺序分割。比如我拿到一个字符串,只需要其中第8段,或者我先要第8段,再要第20段,再要12段。用那些函数就不够方便了。我自己写了一个类,类内部有几个指针,由类自行管理。外部只要调用函数就可以了:一个成员函数Split(const char *str, const char c)一次检查,终身有用,一个成员函数GetSplitedStr(char *target, const int i)用于获取任意一段。 急问:关于创建ADO全局对象失败的问题;在线等 我自己用mfc写的一个类,想封装成com组件,不知道可行不? hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID )有关问题? 急!!!Sybase数据库的修改表名的SQL语句怎么写? 关于完成端口中的PER_IO_DATA结构 两个CAsyncsocket的问题 简单请教 序列化过程中遇到的问题:请近! IE缓存问题 说的好的都有分,请进来看一下。 为List Control加载背景图的问题?? 简单,在线等,马上结帐
多了,
自己去msdn查吧。
不过这个需要你指定哪些字符是分隔符,而且会修改源字符串。
int strToArglist(const char * pszStr, const char * pszToken, XStringList & arglist)
{
int tok_len = ::strlen(pszToken);
int str_len = ::strlen(pszStr);
char* tToken = new char[tok_len + 1];
char* tStr = new char[str_len + 1];
char* tmp = new char[str_len + 1];
char* p1 = tStr; char* p2 = tStr;
::ZeroMemory(tToken,tok_len + 1);
::ZeroMemory(tStr,str_len + 1);
::CopyMemory(tStr,pszStr,str_len);
bool bToken = false; do
{
::ZeroMemory(tmp,str_len + 1);
p2 = ::_tcsstr(p1,pszToken);
if (p1 == p2)
{ } if ((p2 != NULL && p1 == tStr) || *p1 != 0x00 || (p2 == NULL && bToken && *p1 == 0x00))
{
if (p2 == NULL)
::CopyMemory(tmp,p1,::strlen(p1));
else
::CopyMemory(tmp,p1,p2-p1);
XString * pstr = new XString;
*pstr = tmp;
arglist.PushItem(pstr); bToken = true;
} if (p2 != NULL)
p1 = p2 + tok_len;
}
while(p2 != NULL); delete [] tToken;
delete [] tStr;
delete [] tmp; return arglist.Size();
}
因为那些函数往往只能顺序分割。
比如我拿到一个字符串,只需要其中第8段,
或者我先要第8段,再要第20段,再要12段。
用那些函数就不够方便了。我自己写了一个类,
类内部有几个指针,由类自行管理。
外部只要调用函数就可以了:
一个成员函数Split(const char *str, const char c)一次检查,终身有用,
一个成员函数GetSplitedStr(char *target, const int i)用于获取任意一段。