有关把字窜按分隔符转换成数组的问题.

klggg 2003-11-10 05:19:13
先见代码....
在BCB里调试通过.
void free_array(char** Value,int len)
{
for(int i=0;i<len;i++)
{
delete[] Value[i];
}
delete[] Value;
}
//---------------------------------------------------------------------------


/*
separator
要被分离的字窜
split_char
以什么符号进行分离
array_len
返回的数组个数
Exp:
char **mytest;
int array_len;
mytest=ExplodeStr("aaa,bbb,ccc",',',array_len);
for(int i=0;i<array_len;i++)
{
Application->MessageBoxA(mytest[i],"提示信息",0);
}
free_array(mytest,array_len);
*/
char ** ExplodeStr(char* separator,char split_char,int &array_len)
{
/*
1.先得到总维数,然后初始化双重指针
2.切割出每一段字符窜,保存
*/
char **return_array;
char *p; //字符窜指针,指向要分离的字窜
int separator_len=strlen(separator); //字符窜总长度
array_len=0; //保存数组总维数

//得到总共有几维
for(int i=0;i<separator_len;i++)
{
if(separator[i]==split_char) //找到一个
{
array_len++;
}
}
array_len++; //最后是以\0结属也算一维
return_array= new char *[array_len];

p=separator;
int tmp_array=0;
int tmp_len;
for(int i=0;i<separator_len;i++)
{
if(separator[i]==split_char) //找到一个
{
tmp_len=&separator[i]-p; //得到要被切的字符窜长度
p[tmp_len]='\0'; //设置指针字窜结束点
return_array[tmp_array]= new char [tmp_len+1]; //分配内存
strcpy(return_array[tmp_array],p);
p[tmp_len]=split_char; //恢复
p=&separator[i+1]; //指向新位置
tmp_array++;
}
}
return_array[tmp_array]= new char [strlen(p)+1]; //分配内存
strcpy(return_array[tmp_array],p);
return return_array;
}

----------------------------------------------
这里
1.
char ** ExplodeStr(char* separator,char split_char,int &array_len)
我想 char **str; 类型的变量,能不能直接得到其有几个维数?
我目前还不知道单纯根据 char **str 就用统计出一共有几维
的方法。所以只能传递一个引用整形变量了。
2.
我里把字符窜循环了两边,第一边循环单单只是为了得到将被切割后共总有几维,好为
char ** 预先分配内存空间,但总感觉这段的循环很是浪费,特别在字窜长的时候,大
家帮我看看有没什么办法避免.
另这段程序在指针运用上是否存在什么问题?
谢谢!
...全文
64 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
klggg 2003-11-13
  • 打赏
  • 举报
回复
对于这个功能没必要用链表来管理吧.:)
sevencat 2003-11-12
  • 打赏
  • 举报
回复
C库的strtok可能有用,我一般都用这个函数。
laomai 2003-11-12
  • 打赏
  • 举报
回复
那你为什么不用链表来管理这个字符串数组呢?
klggg 2003-11-12
  • 打赏
  • 举报
回复
第二个问题,
这个循环确实有点浪费,因为数组的列数是一定的,所以你在搜索到第一个分隔符时就可以确定整个二维数组的行数与列数。
此时,列数等于你搜索过的字符的个数,行数可由整个字符串的长度和列数的关系得到,
--------
嘿。这里的列数可不是固定的呀.例如分割以下字窜
mytest=ExplodeStr("123,456789,abcd", ',', array_len);
这时如果你在搜索到第一个分隔符时就确定列数。那肯定出错了:)
因为是双重指针其每一行的列数可以动态,都可以是不确定的.
谢谢你的回复,也就是说这个感觉多余的字窜循环是免不了的吧?
laomai 2003-11-11
  • 打赏
  • 举报
回复
你的指针运用没什么问题,只是贴出的时候格式有点乱,我帮你整理了一下,以方便别的朋友查看
/*释放动态二维数组*/
void free_array(char** Value,int len)
{
for(int i=0;i<len;i++)
{
delete[] Value[i];
}
delete[] Value;
}


/*参数含义:
separator 要被分离的字符串
split_char 以什么符号进行分离
array_len 返回的数组个数
*/

char ** ExplodeStr(char* separator,char split_char,int &array_len)
{
char **return_array;
char *p =separator; //字符串指针,指向要分离的字窜
int separator_len = strlen(separator);
array_len=0; //保存数组总维数
//得到总共有几维
for(int i=0;i<separator_len;i++)
{
if(separator[i]==split_char) //找到一个分割符
{
array_len++;
}
}
array_len++;
return_array = new char *[array_len];
int tmp_array=0;
int tmp_len;
for(int i=0;i<separator_len;i++)
{
if(separator[i]==split_char) //找到一个分割符
{
tmp_len=&separator[i]-p; //得到要被切的字符窜长度
p[tmp_len]='\0'; //设置指针字窜结束点
return_array[tmp_array]= new char [tmp_len+1]; strcpy(return_array[tmp_array],p);
p[tmp_len]=split_char; //恢复
p=&separator[i+1]; //指向下一行行首
tmp_array++;
}
}
/*循环结束后拷贝最后一行*/
return_array[tmp_array]= new char [strlen(p)+1];
strcpy(return_array[tmp_array],p);
return return_array;
}
//---------------------------------------------------------------------------
main()
{ char **mytest;
int array_len;
mytest=ExplodeStr("aaa,bbb,ccc", ',', array_len);
for(int i=0;i<array_len;i++)
{
cout<<mytest[i]<<endl;;
}
free_array(mytest,array_len);
system("pause");
}
laomai 2003-11-11
  • 打赏
  • 举报
回复
我的个人回答,
第一个问题,
C语言是无法知道你动态生成的数组的大小的,所以array_len这个参数是必须的,你可以看一下C教材中有关数组做函数参数时的叙述就知道了。
第二个问题,
这个循环确实有点浪费,因为数组的列数是一定的,所以你在搜索到第一个分隔符时就可以确定整个二维数组的行数与列数。
此时,列数等于你搜索过的字符的个数,行数可由整个字符串的长度和列数的关系得到,
字符串总个数=行数*列数+行数-1, 注意要考虑到分割符也占位的
可以反推出行数,这样char ** 要分配的空间大小就定下来了。
不当之处,敬请指教。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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