C char** 的一点儿理解
理解是就是char** 相当于字符串数组,我以往纠结于该用 **arr还是*arr还是 (*arr),还是(**arr);
对于**arr而言:*arr代表数组的最开头,也就是第一个字串的内容。**arr代表什么,不知道,这么用会报错。
简单的来说arr[0],代表第一个字符串的值,实际指向的整个**arr的首地址,如果用printf之类的处理函数,会把它之后的地址的内容也打印出来,直到找到0。
下面是一个分割字符串的代码,l会保存分割出来的长度。
2014-09-09 结构体数组处理:http://blog.csdn.net/leinchu/article/details/11559547
字符串以为数组实际是2维字符数组,但结构提1维数组就只需要一维——这个问题我没认识清楚,受字符串数组的迷惑,走了不少弯路。
char** split(char *strin, char *seprator, int *l, int max) {
char **rtn;
rtn = (char **) malloc(sizeof(char **));
char *str = strdup(strin);
char *str0 = str;
char *p;
p = strstr(str, seprator);
if (p == NULL) {
*l = 1;
*rtn = str;
return rtn;
}
int i, len, spl, inlen, plen;
spl = strlen(seprator);
max--;
*l = 0;
while (p != NULL) {
if (*l > 0)
rtn = realloc(rtn, ((*l) + 1) * sizeof(char **));
inlen = strlen(str);
plen = strlen(p);
if (!plen)
break;
len = inlen - plen;
rtn[*l] = malloc(len + 1);
strncpy(rtn[*l], str, len);
rtn[*l][len] = 0;
str += (len + spl);
p = strstr(str, seprator);
(*l)++;
if (*l == max || p == NULL) {
/*if (*l == max) {
len = strlen(rtn[*l - 1]) + strlen(str) + 1;
rtn[*l - 1] = realloc(rtn[*l - 1], len);
strncat(rtn[*l - 1], str, len - 1);
} else {*/
len = strlen(str);
rtn = realloc(rtn, ((*l) + 1) * sizeof(char **));
rtn[*l] = malloc(len + 1);
strncpy(rtn[*l], str, len);
rtn[*l][len] = 0;
//}
(*l)++;
break;
}
}
free(str0);
return rtn;
}
C char** 的一点儿理解的更多相关文章
- int main(int argc,char* argv[]) 简单理解
(1)第一个int代表整个main函数的返回值,若函数正常执行完毕,返回0,异常返回则是-1 (2)int argc代表命令行参数的总个数,既然是个数,那就是整型的,即:int; (3)char* a ...
- 对char类型的理解以及对补码的理解分析
今天遇到这样一个小程序,觉得当中有些问题很容易让人忽略的! 这个程序代码如下: 程序的结果为: 我想很多像我一样的小白可能才开始是想不明白为什么最后的结果是255吧!首先,我们得知道 strlen() ...
- char型变量理解
char c = 128; printf("%d", c); 问输出是多少? 正确答案应该是-128. 如下几种情况: char c=128;printf("%u\n& ...
- 加深关于Java中char类型的理解
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- 【C++】char* 和 char[] 区别的理解
string 是一个类,其中有一个 char * 类型的私有变量. 因此可以如下构建一个string类型的变量. string str = "abcd"; 其中,右值“abcd”一 ...
- const char * 组合理解
1 . const char *ptr 从char *ptr 可以理解为指向字符常量的指针,ptr是一个指向char *的常量,*ptr的值为const,不能修改. 2. char const *pt ...
- Matlab 之 FFT的理解和应用
网上看了一些大牛的关于FFT的见解,加上自己的一点儿理解,针对以下这几个问题来加深对FFT的理解. 不知道大家有没有类似以下几点的困惑: 问题的提出 对于1秒钟输出的连续信号,使用采样率Fs不同,就会 ...
- char、signed char、unsigned char的区别总结。
转载地址:http://hi.baidu.com/thewillreigns/blog/item/67e665c4296e69c038db492d.html char 和 unsigned char是 ...
- 红茶一杯话Binder (ServiceManager篇)
1.先说一个大概 Android平台的一个基本设计理念是构造一个相对平坦的功能集合,这些功能可能会身处于不同的进程中,然而却可以高效地整合到一起,实现不同的用户需求.这就必须打破过去各个孤立App所形 ...
随机推荐
- 优秀c++开源项目集合
本文会持续更新, 我希望通过这篇文章把我看到过的优秀开源项目记录下来, 有时间仔细阅读. cockroachdb 前googler开发的开源的spanner数据库: https://github.co ...
- MyISAM与InnoDB的索引实现
1.MyISAM 使用B+Tree 作为索引结构,叶子节点的data存放指针,也就是记录的地址.对于主键索引和辅助索引都是一样的.2.InnoDB 也使用B+Tree作为索引结构,也别需要注意的是,对 ...
- [转]Java代码(性能)优化总结
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...
- commons-logging日志系统
日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息 是寸步难行的.所以在系统加入日志是必须的. 最原始的日志方式,就是在程序的适当地方添加System.out.prin ...
- Android Context 是什么?
andorid 开发(42) 版权声明:本文为博主原创文章,未经博主允许不得转载. [转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] PS ...
- hibernate的注解属性mappedBy详解
mappedBy: 1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性: 2>mappedBy标签一定是定义在被拥 ...
- Android控件之Button(按钮控件)和ImageButton(图片按钮控件)
一.Button和ImageButton特证: 1.共同特证: 都可以作为一个按钮产生点击事件 2.不同特证: Button有text的属性,ImageButton没有 ImageButton有src ...
- 20160808_卸载OpenJDK
1.查看信息 [root@localhost ~]# rpm -qa | grep jdkjava-1.6.0-openjdk-devel-1.6.0.0-1.50.1.11.5.el6_3.x86_ ...
- requestAnimationFrame兼容性扩展
/** * requestAnimationFrame兼容性扩展,两方面工作: * 1.把各浏览器前缀进行统一 * 2.在浏览器没有requestAnimationFrame方法时将其指向setTim ...
- sql CHARINDEX函数
CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置.CHARINDEX函数调用方法如下: CHARINDEX ( expression1 , expression2 [ , start ...