请教一个C语言下字符串的分割问题

sxjkk 2009-10-19 04:16:43
我写了一个方便字符串分割的程序,程序如下


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

char *input = NULL;
int i, j, sepCount, inputLength;

/**
* 初始化各种变量
*/
void init()
{
i = 0;
j = 0;
sepCount = 0;
inputLength = 0;
}

/**
* 计算需要的指针数组长度
*
* @param argement 需要分割的字符串
* @param separator 分割符号,比如'/'
*/
void getSepCount(char *argement, char separator)
{
input = argement;
inputLength = strlen(input);
for(i = 0;i < inputLength;i++)
{
if(input[i] == '/')
sepCount++;
}
}

/**
* 分割字符串过程方法
*
* @param separator 分割符号,比如'/'
*/
char ** sepResult(char separator)
{
int array_pointer_length = sepCount + 1;

char **str = (char**)malloc(sizeof(char*) * array_pointer_length);

int pos = 0;
char *p = input;

for(i = 0;i < inputLength;i++)
{
pos++;
if(input[i] == separator)
{
str[j] = (char*)malloc(sizeof(char) * pos);
strncpy(str[j], p, pos - 1);
str[j][pos + 1] = '\0';
p = p + pos;
pos = 0;
j++;
}
}

str[j] = (char*)malloc(sizeof(char) * (pos+1));
strncpy(str[j], p, pos+1);
str[j][pos] = '\0';

return str;
}

/**
* 根据传入的字符串和分割符号进行分割操作,并返回结果
*
* @param str_sep 需要分割的字符串
* @param separator 分割符号,比如'/'
*/
char ** sep_string_result(char *str_sep, char separator)
{
init();
getSepCount(str_sep, separator);
char **str = sepResult(separator);
return str;
}

/**
* 释放各种资源和创建的指针
*
* @param str 创建的用来存储的字符串指针数组
*/
void release(char **str)
{
int length = sepCount + 1;
int i = 0;
for(i = 0; i < length; i++)
{
free(str[i]);
str[i] = NULL;
}
free(str);
str = NULL;
input = NULL;
}

int main(int args, char *argv[], char *env[])
{
char **str = sep_string_result("mytest/webapps/StrutsTest/file/tarfile/123.tar", '/');
int length = sepCount + 1;
for(i = 0; i < length; i++)
printf("%s\n", str[i]);

release(str);

}



1.首先我想问下,如何求类似char **str这个定义的一个指针数组的长度,也就是元素个数。
我这里用的是实现计算好了数组的长度,但是如果想把这个程序拿来直接使用,还是必须要
通过数组的变量名,就可以得到数组的长度

2.我这种程序目前只能处理按'/'的分割,但是我换成按','分割就不行了,
比如"mytest,webapps,StrutsTest,file,tarfile,123.tar",就无法得出正确的结果,理论上
应该是用哪种字符的分割都应该成功

麻烦大家帮忙看看,谢谢了
...全文
641 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxjkk 2009-10-19
  • 打赏
  • 举报
回复
谢谢qizhi0119的代码

我去试试
ynkmfenglu 2009-10-19
  • 打赏
  • 举报
回复
同意11楼的做法,sizeof只是一个运算符,它计算的只是相应的对象的大小,sizeof(str)意思是计算str这个对象的大小,也就是指针的大小,当然是一个机器字的大小咯。如果将str定义为数组来存放字符串的话,sizeof(str)得出的也是str这个数组的长度,而不是楼主要的字符串长度,字符串长度获取要么使用库函数strlen,要么像11楼一样自己写一个函数来计算。
qizhi0119 2009-10-19
  • 打赏
  • 举报
回复
给你示例:
#include <stdio.h>
#include <string.h>
unsigned int getlen(char *p,char *t)
{
int len = 1;
char *tp=p;
while((tp=strstr(tp,t))!=0)
{
++len;
tp += 1;
}
tp = p+strlen(p)-1;
if(*tp == *t)
{
--len;
}
return len;
}
int main()
{
char c[]="mytest/webapps/StrutsTest/file/tarfile/123.tar";
unsigned int len = getlen(c,"/");
printf("len:%d\n",len);
return 0;
}
qizhi0119 2009-10-19
  • 打赏
  • 举报
回复
好像是只改了这个函数吧.忘了.嘿嘿.

char ** sepResult(char separator)
{
int array_pointer_length = sepCount + 1;

char **str = (char**)malloc(sizeof(char*) * array_pointer_length);

int pos = 0;
char *p = input;

for(i = 0;i < inputLength;i++)
{
pos++;
if(input[i] == separator)
{
str[j] = (char*)malloc(sizeof(char) * pos+1);
memset(str[j],0,pos+1);//这个是我加的,长度有一处我也改了点.
strncpy(str[j], p, pos - 1);
// str[j][pos] = '\0';
p = p + pos;
pos = 0;
j++;
}
}

str[j] = (char*)malloc(sizeof(char) * (pos+1));
strncpy(str[j], p, pos+1);
str[j][pos] = '\0';

return str;
}


如果求长度的话可以用这个函数
char *strstr(const char *haystack, const char *needle);
这个是在原串中找子串的,你可以用这个函数的话,比你一个字符一个字符找能简化些.
sxjkk 2009-10-19
  • 打赏
  • 举报
回复
请问8楼你修改了哪里?我没有找到
我想要的是这段
char **str = sep_string_result("mytest/webapps/StrutsTest/file/tarfile/123.tar", '/');
int length = sepCount + 1;
这里的length长度希望用一个函数去计算这个str指针数组的长度
qizhi0119 2009-10-19
  • 打赏
  • 举报
回复
行了,初步改完了,在我机器上不报错了.
程序如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *input = NULL;
int i, j, sepCount, inputLength;

/**
* 初始化各种变量
*/
void init()
{
i = 0;
j = 0;
sepCount = 0;
inputLength = 0;
}

/**
* 计算需要的指针数组长度
*
* @param argement 需要分割的字符串
* @param separator 分割符号,比如'/'
*/
void getSepCount(char *argement, char separator)
{
input = argement;
inputLength = strlen(input);
for(i = 0;i < inputLength;i++)
{
if(input[i] == '/')
sepCount++;
}
}

/**
* 分割字符串过程方法
*
* @param separator 分割符号,比如'/'
*/
char ** sepResult(char separator)
{
int array_pointer_length = sepCount + 1;

char **str = (char**)malloc(sizeof(char*) * array_pointer_length);

int pos = 0;
char *p = input;

for(i = 0;i < inputLength;i++)
{
pos++;
if(input[i] == separator)
{
str[j] = (char*)malloc(sizeof(char) * pos+1);
memset(str[j],0,pos+1);
strncpy(str[j], p, pos - 1);
// str[j][pos] = '\0';
p = p + pos;
pos = 0;
j++;
}
}

str[j] = (char*)malloc(sizeof(char) * (pos+1));
strncpy(str[j], p, pos+1);
str[j][pos] = '\0';

return str;
}

/**
* 根据传入的字符串和分割符号进行分割操作,并返回结果
*
* @param str_sep 需要分割的字符串
* @param separator 分割符号,比如'/'
*/
char ** sep_string_result(char *str_sep, char separator)
{
init();
getSepCount(str_sep, separator);
char **str = sepResult(separator);
return str;
}

/**
* 释放各种资源和创建的指针
*
* @param str 创建的用来存储的字符串指针数组
*/
void release(char **str)
{
int length = sepCount + 1;
int i = 0;
for(i = 0; i < length; i++)
{
free(str[i]);
str[i] = NULL;
}
free(str);
str = NULL;
input = NULL;
}

int main(int args, char *argv[], char *env[])
{
char **str = sep_string_result("mytest/webapps/StrutsTest/file/tarfile/123.tar", '/');
int length = sepCount + 1;
for(i = 0; i < length; i++)
printf("%s\n", str[i]);

release(str);

}
sxjkk 2009-10-19
  • 打赏
  • 举报
回复
呵呵,刚才就是试了sizeof(str),无论什么样的要分割的字符串都返回结果为4,所以我郁闷

想找个函数,直接求出这种数组指针的长度,不知道有没有
qizhi0119 2009-10-19
  • 打赏
  • 举报
回复
str是指针类型,你用sizeof求长就有问题
如果要是指针型的话,sizeof(str)就是4.当然求不出好用的长度了.别的还没看哪,等会看看.
sxjkk 2009-10-19
  • 打赏
  • 举报
回复
回楼上,可以的,请写出你的方法

谢谢
liem 2009-10-19
  • 打赏
  • 举报
回复

如何求char **str;这个指针数组的长度(元素个数)

由于该数组是动态分配,因此无法用一般方式知道指针数组
如果数组长度很重要,是否可以用结构体?
sxjkk 2009-10-19
  • 打赏
  • 举报
回复

我的失误...检查的时候没有看到,在这闹笑话了,呵呵

另外,在想问下大家,如何求char **str;这个指针数组的长度(元素个数)
wanjingwei 2009-10-19
  • 打赏
  • 举报
回复
貌似你这个函数就只处理'/'
void getSepCount(char *argement, char separator)
{
input = argement;
inputLength = strlen(input);
for(i = 0;i < inputLength;i++)
{
if(input[i] == '/') //你换成separator不就可以处理任何字符了
sepCount++;
}
}
sxjkk 2009-10-19
  • 打赏
  • 举报
回复
补充一点,求数组的长度,用sizeof(str)/sizeof(char)这种方法刚试了,无法正确的求出正确的长度,问下大家有没更好的方法呢?

69,336

社区成员

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

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