C 语言 实现 字符串 分割 函数(返回"二维字符数组",及分割后的字符数组的长度)
2011-12-26 14:34
716 查看
这段时间重拾C语言. 之前只是在大学时草草的学习了一年时间.当然与大部分同学一样.90%以上都还给了老师. 现在只是依稀得记得好像似乎大概学习过~~
为什么要写这个字符串分割的实现呢. 主要也是对这段时间学习的一个总结. 觉得自带的strtok 方法实现得不够方便 .用惯了C# 还是希望他可以直接将 分割后的字串返回.
其中也练习了几个知识点:结构体,指针,malloc ,释放内存等...
View Code
为什么要写这个字符串分割的实现呢. 主要也是对这段时间学习的一个总结. 觉得自带的strtok 方法实现得不够方便 .用惯了C# 还是希望他可以直接将 分割后的字串返回.
其中也练习了几个知识点:结构体,指针,malloc ,释放内存等...
View Code
#include <stdio.h> #include <string.h> #include <stdlib.h> struct sstruct //分割后返回的结构体定义 { char **p; //指向生成的字符数组("二维") int len; //记录"二维数组"的长度. 也就是被分成了几个字符串 }; //实现字符串按给定的from to值 来拷贝的方法,在分割函数中会用到 void strCopy(char *src,char *dst,int from,int to) { int n = 0; for(int i = from;i<=to;i++) { *(dst + n) = *(src + from + n); n++; } *(dst+n) = '\0'; //字串后需要加这个,不要忘了. } //字符串分隔函数 返回 sstruct 结构体指针 struct sstruct * strSplit(char arr[],char s) { int arrlen = strlen(arr); //得到数组的长度 arrlen int pos[10]; //定义一个数组,用来存放所找到的字符所在的位置,在这里最多可以放10个. 一般情况10个就够了. for(int i = 0;i<10;i++) pos[i] = -1; //将 pos 里的内容初始化为 -1 int find = 0; for(int i =0;arr[i];i++) //在arr 中去寻找 字符 s 将找到的位置放到 pos 中. { if(arr[i] == s) { pos[find] = i; find ++; } } int num = (find+1) * 2; int segs= 0; //真正的有几个段 int segMaxLen = 0; //表示被分割中最长的元素.用这个值 来生成输出的二维数组 int segArr[num]; //将每分割段的两头的值 放入segArr for(int i = 0;pos[i] != -1;i++) //*分析 pos 数组. 得到分割后的字符域segArr,及真正的段数segs { if(i == 0) { segMaxLen = pos[0] ; //字串的最大长度 //放入segArr if(pos[0] == 0 ) { segArr[0] = -1; //如果 位置在最前 ,最后, 或是两个或 多个分割符连在一起的话 如: @XXX@@@XXX@ 这之间的位给为 -1 segArr[1] = -1; } else { segArr[0] = 0; //如果是分割符之间存在字符如 3 -- 7 ,则向segArr中写入其之间的值 4 - 6 ,代表,这段被分割的字符串的首尾. segArr[1] = pos[0]-1; segs ++; //找到一个合理的,被分割的字符中.segs加1. } } else { int tmp =pos[i] -pos[i-1]; segMaxLen = tmp > segMaxLen ? tmp : segMaxLen; //放入 segArr if(tmp == 1 ) { segArr[i*2] = -1; segArr[i*2+1] = -1; } else { segArr[i*2] = pos[i-1]+1; segArr[i*2+1] = pos[i] -1; segs ++; } } if(pos[i] == arrlen || pos[i+1] == -1) //最后一个. 还要与arr 的总长比较 { int tmp = arrlen - pos[i]; segMaxLen = tmp > segMaxLen ? tmp :segMaxLen; if(arrlen - pos[i] == 1) { segArr[i*2+2] = -1; segArr[i*2+3] = -1; } else { segArr[i*2+2] = pos[i]+1; segArr[i*2+3] = arrlen; segs ++; } } } //*最终得到的需要返回的数组* char **sstr = (char **)malloc(sizeof(char*)*segs); //***输出的 "二维数组" 的指针*** for(int i = 0;i<segs;i++) //***对里面的内容进行初始化*** *(sstr + i) = (char*)malloc(sizeof(char *)*segMaxLen); int w = 0; for(int i = 0;i<num;i+=2) { if(segArr[i] != -1) { strCopy(arr,*(sstr + w),segArr[i],segArr[i+1]); // 对输出的数组进行赋值 w++; } } //创建输出的结构体 //这里返回的是一个 结构体指针(在结构体不大的时候直接返回结构体会更方便些) struct sstruct *ww = (struct sstruct *)malloc(sizeof(struct sstruct)); ww->p = sstr; ww->len = segs; return ww; /* 注意: 在这个函数中使用 malloc 为指针,初始开辟的内存空间 要在主函数使用这个方法之后.将其释放.free(); */ } //主函数 int main() { //待分割的串 char str[] = "@ABCdefG@你好~~@hello world@1655@*(^*(^下是另 中"; struct sstruct *ww; //为分隔后返回的结构体创建一个存放的位置 ww = strSplit(str,'@'); //*调用strSplit 方法实现字符串分割*// //输出 ww->len: 为分割后字符串的数量 ww->p 指向第一个串 用for来输出反有的串 *(w->p + i) for (int i = 0;i<ww->len;i++) printf("%s\n",*(ww->p + i)); //释放二维数组的列 for(int i = 0;i<ww->len;i++) free(*(ww->p + i)); //释放二维数组 free(ww->p); //释放结构体指针 free(ww); }
相关文章推荐
- C 语言 实现 字符串 分割 函数(返回"二维字符数组",及分割后的字符数组的长度)
- 写一个函数,用来把一个字符串用指定的字符作为分隔符分割成若干个子串输出 | 写一个函数,用来返回一个字符串中重复出现的最长字串的长度及其开始地址
- C++怎么让函数返回固定长度字符串,比如给“zhangsan"返回原字符串加上4各空格,给“lisi"返回"lisi"加6
- C语言 编写字符串操作函数strrchr,在字符串中查找目标字符最后一次出现的位置,返回指向这次位置的指针。
- 编写函数 void count(char a[],char w[][10],int n,int b[]).功能是:统计w指向的数组中的n个单词在a指向的字符串中各自出现的次数(将非字符字符看作单词分割
- 字符串分割到二维字符数组中:
- Lua 用指定字符或字符串分割输入字符串,返回包含分割结果的数组
- 有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". 要求: 不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
- char * 与 char [] 区别,char *[] 与 char[][]区别。字符串指针的数组与二维char数组区别。字符串常量赋予指针与字符数组区别。"字符串"等价于其首元素"字"的地址
- 写一个函数,实现两个字符串的比较。即实现strcmp函数,s1=s2时返回0,s1!=s2时返回二者第一个不同字符的ASCII值。
- 编程:用java 语言实现,输入一个数,就相应地输出的几维数组!||用1、2、2、3、4、5这六个数字,用java写一个函数,打印出所有不同的排列,要求:"4"不能在第三位,"3"与"5"不能相连
- 字符串按照一定长度分割并返回数组!(String按照给定长度分割)
- 字符串替换空格: 请实现一个函数,把字符数组中的每个空格替换成“%20”。 例如输入“we are happy.”,则输出“we are happy.”
- 给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串
- 改写函数实现PHP二维/三维数组转字符串
- 有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". 要求: 不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
- Stirng类的常见用法:输出str长度,输出第一个"o",和最后一个"o"的索引,将str中的字符"l"替换成"m",字符串str按空格“ ”分割为2个字符串,比较这两个字符串是否相等。
- JavaScript基础 split("") 将字符串分割成字符数组
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
- 如果字符串的一个子串(其长度大于 1)的各个字符均相同,则称之为等值子串。试设计一算法,求出串S中的最大等值子串 函数返回最大等值子串的长度,如果没有则返回1。 例如: 若S= “abc123abc1