自己写的分割字符串的函数Split , 感觉效率太低了, 争求改善建议100分

developCpp 2007-06-09 05:21:48
自己写的分割字符串的函数Split , 感觉效率太低了, 争求改善建议
代码如下

#include <stdio.h>
#include <string.h>
#include<malloc.h>

char** split(const char* InputString,const char* Symbol,unsigned int& StrCount)
{
char sBuffer[255];
strcpy(sBuffer,InputString);

if(sBuffer[strlen(sBuffer)-1]!=',')
strcat(sBuffer,",");

char *result;
char sTemp[80];

StrCount=0;
result=strstr(sBuffer,",");
while(result)
{
StrCount++;
result=strstr(result+1,",");
}
printf("number is %d\n",StrCount);

char(* OutputStrings)[80];
OutputStrings=(char(*)[80])malloc(sizeof(char)*80*StrCount);

StrCount=0;
while((result=strstr(sBuffer,","))!=NULL)
{
int pos=result-sBuffer;
strncpy(sTemp,sBuffer,pos);
sTemp[pos]=0;
//printf("%s\n",sTemp);
strcpy(OutputStrings[StrCount],sTemp);
StrCount++;
strcpy(sBuffer,sBuffer+pos+1);
}

return (char**)OutputStrings;
}

int main(int argc, char* argv[])
{
printf("Input a string:\n");
char sText[255];
gets(sText);
printf("the string entered was: %s\n",sText);

unsigned int iCount;
char(* ArrayString)[80];
ArrayString=(char (*)[80])split(sText,",",iCount);

for(unsigned int i=0;i<iCount;i++)
printf("%s\n",ArrayString[i]);
return 0;
}
...全文
528 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingwow99 2008-01-09
  • 打赏
  • 举报
回复
碰巧路过
发一个自己写的分隔函数 MFC的
与楼上诸兄相比,控制参数稍复杂一点,实用与否自己判断了
函数名老了点,叫Extract....,跟MFC学的


#define ESSF_ALLOWHEADEMPTY 0x01 //指定源串以分割符开头时,split出一个"",否则不
#define ESSF_ALLOWTAILEMPTY 0x02 //指定源串以分割符结尾时,split出一个"",否则不
#define ESSF_ALLOWMIDEMPTY 0x04 //指定遇到连续两个分割符,split出一个"",否则不
#define ESSF_ALLOWFULLEMPTY 0x08 //指定当源串为""时,split出一个子串"",否则不
#define ESSF_TRIMHEAD 0x10 //split前trim lef
#define ESSF_TRIMTAIL 0x20 //split前trim right

void ExtractSubStrings(CStringArray& arr, LPCTSTR strSrc, const CString sep, DWORD nFlags)
{
if (strSrc == NULL)
return;

//clear array
arr.RemoveAll();

//trim
CString str(strSrc);
if (nFlags & ESSF_TRIMHEAD) str.TrimLeft();
if (nFlags & ESSF_TRIMTAIL) str.TrimRight();

//full empty
if(str.IsEmpty()) {
if (nFlags & ESSF_ALLOWFULLEMPTY) arr.Add(_T(""));
return;
}

// 开始分解
bool ishead=true;
int pos = str.Find(sep);
while (pos != -1)
{
if (!str.Left(pos).IsEmpty() ||ishead && (nFlags & ESSF_ALLOWHEADEMPTY) || !ishead && (nFlags & ESSF_ALLOWMIDEMPTY))
arr.Add(str.Left(pos));

ishead = false;

str = str.Mid(pos + sep.GetLength());
pos = str.Find(sep);
}

//tail
if (!str.IsEmpty() || (nFlags & ESSF_ALLOWTAILEMPTY))
arr.Add(str);

return;
}

developCpp 2007-06-15
  • 打赏
  • 举报
回复
finalwei(巍)
我们好像是本家哦
哪里人阿
有空多交流QQ:34510687
finalwei 2007-06-15
  • 打赏
  • 举报
回复
呵呵 很齐全
developCpp 2007-06-15
  • 打赏
  • 举报
回复
http://download.csdn.net/user/developCpp
developCpp 2007-06-15
  • 打赏
  • 举报
回复
不好意思,忘记了一点,在最下面加两行代码
......
array.RemoveAll();
array.FreeExtra();
return 0;
}

CStringArray占用内存太大,

记得用完之后要释放内存哦
否则程序占用的内存会越来越大,一直到重新启动计算机为止
developCpp 2007-06-15
  • 打赏
  • 举报
回复
下面补充一个MFC版本的Split函数, 供大家选择使用

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

using namespace std;

void Split(CStringArray &array,const CString InputString,const CString Symbol)
{
CString sBuf;
sBuf=InputString;
if (sBuf.Right(1) != Symbol)
sBuf +=Symbol;

CString sTemp;
int pos =-1;
int start=0;
while ((pos=sBuf.Find(Symbol,start)) != -1)
{
sTemp = sBuf.Mid(start,pos-start);
array.Add(sTemp);
start=pos+1;
}
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
return 1;
}

// TODO: code your application's behavior here.
cout << "Input a string:" << endl;

char sText[255];
cin.getline(sText,255);

cout << "the string entered was: " << sText <<endl;

CStringArray array;
Split(array,sText,",");

for(int i=0;i<array.GetSize();i++)
{
cout << (LPCTSTR)array.GetAt(i) << endl;
}
return 0;
}
吹雪 2007-06-15
  • 打赏
  • 举报
回复
//我写的自己用的:)因为strtok不合适.
int GetNextToken( char *source,char *token )
{
int nLen1 = strlen( source ),nLen2 = strlen( token );
if( nLen1 == 0 || nLen2 == 0 )
{
return -1;
}

char *p = strstr( source,token );
//如果没找到token,返回源字符串长度.
if( p == NULL )
{
return nLen1;
}
//如果找到了,返回找到的这一段的长度.
//如果源的前面与token是一样的,那么返回的长度等于0.
else
{
return nLen1 - strlen( p );
}
}
finalwei 2007-06-14
  • 打赏
  • 举报
回复
看到了 以后就用这个了。
finalwei 2007-06-14
  • 打赏
  • 举报
回复
期待你改完的版本出来。。我也好顺便用用
developCpp 2007-06-14
  • 打赏
  • 举报
回复
http://download.csdn.net/source/193868
developCpp 2007-06-14
  • 打赏
  • 举报
回复
上传到 CSDN 下载区
不需要积分的, 免费下载哦
developCpp 2007-06-13
  • 打赏
  • 举报
回复
To finalwei(巍)
To gofqjyie(誓将天下了然于胸)

Good idea!

thanks!
longjing_g 2007-06-09
  • 打赏
  • 举报
回复
char sBuffer[255];
strcpy(sBuffer,InputString);

这些浪费的时间只怕不比循环少啊
finalwei 2007-06-09
  • 打赏
  • 举报
回复
可以试试靠输入的字符串来动态生成长度 这样利用率更高点
长尾巴的悟空 2007-06-09
  • 打赏
  • 举报
回复
动态调整,效率就会提高.

会汇编更好~~呵呵.
developCpp 2007-06-09
  • 打赏
  • 举报
回复
那些地方呢? 怎么修改才好呢?

分割后的小字符串长度为80,
可以用活的吗?
根据输入来自己定义吗?
finalwei 2007-06-09
  • 打赏
  • 举报
回复
很多地方定的太死了。
developCpp 2007-06-09
  • 打赏
  • 举报
回复
可是本人对vector<string>不习惯,
所以就重新写了个函数,
望各位大侠给点建议,做到最完美,
以后新手们也可以用了阿
developCpp 2007-06-09
  • 打赏
  • 举报
回复
StrCount循环了两次, 实在感觉不爽阿

可就是想不出更好的方法, google搜索只有STL版本的

bool split( const string& InputString,
vector<string>& OutputStrings,
unsigned int& StrCount,
const string& Symbol )
{
StrCount = 0;
if( InputString.empty() )
return false;

size_t pos1 = 0, pos2 = 0;
size_t end_pos = InputString.size() - 1;

while( pos1 <= end_pos )
{
pos2 = InputString.find( Symbol, pos1 );
if( pos2 >= pos1 )
{
++StrCount;
if( StrCount > OutputStrings.size() )
OutputStrings.push_back( pos2 == pos1 ? ""
: InputString.substr(pos1, pos2 - pos1) );
else
OutputStrings[StrCount - 1] =
( pos2 == pos1 ? "" : InputString.substr(pos1, pos2 - pos1) );
}
pos1 = ( pos2 == InputString.npos ? pos2 : pos2 + 1 );
}

return true;
}
cpio 2007-06-09
  • 打赏
  • 举报
回复
还可以啊,几个循环就完成了

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧