您的位置:首页 > 编程语言 > C语言/C++

C/C++中的字符串分割

2011-09-24 21:29 309 查看
 C/C++中的字符串分割

 转自http://apps.hi.baidu.com/share/detail/37296066

字符串按照特定字符进行分割是编程时候经常要用到方法

MFC中CString和std::string 常可以用 find() + Mid() 的方法来实现

CString实现:

Cpp代码 

inline static void split(CString src, CString token, vector<CString>&vect)    

{    

    int nend=0;    

    int nbegin=0;    

    while(nend != -1)    

    {    

        nend = src.Find(token,nbegin);    

        if(nend == -1)    

           vect.push_back(src.Mid(nbegin, src.GetLength()-nbegin));    

        else   

            vect.push_back(src.Mid(nbegin,nend-nbegin));    

        nbegin = nend + 1;    

    }    

}    

std::string实现

Cpp代码 

inline static void split(std::string src, std::string token,vector<std::string>& vect)    

{    

    int nend=0;    

    int nbegin=0;    

    while(nend != -1)    

    {    

        nend = src.find_first_of(token,nbegin);    

        if(nend == -1)    

           vect.push_back(src.substr(nbegin, src.length()-nbegin));    

        else   

           vect.push_back(src.substr(nbegin, nend-nbegin));    

        nbegin = nend + 1;    

    }    

}   

上面2个例子中,分割出来字符串都是重新分配了内存的。

例如CString中Mid()函数就会

       CString dest;

        AllocCopy(dest, nCount, nFirst, 0);//这个地方将会为 dest分配内存空间 

        return dest;

所以在负荷较高的运行环境下会频繁的分配小块内存和释放小块内存,比较容易生产内存碎片,而且效率也不高。

潜意识中喜欢追求底层细节,让我想了解 在C语言中 char * 到底是怎么实现分割的?

果不其然C语言中的 strtok() 函数能够实现字符串的分割而且效率超高,不需要对分割后的字符串进行内存分配,而只是将被分割字 符中的 分隔符 ( token ) 以\0代替。而大家都知道 字符串都是以\0结尾的,所以这样就达到了将一个整串分割成多个字符串的目的。

char * 实现:

Cpp代码 

inline static void Split(const char* content, const char* token,vector<std::string>& vect)    

{    

    if(content == NULL)    

          return;    

    int len = strlen(content);    

    if(len <= 0)    

        return;    

    char* pBuf =(char*)malloc(len+1);    

    strcpy(pBuf , content);    

    char* str = strtok(pBuf , token);    

    while(str != NULL)    

    {    

       vect.push_back(str);    

        str = strtok(NULL,token);    

    }    

    free(pBuf);    

}  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息