C char** 的一点儿理解

时间:2023-03-09 04:31:37
C char** 的一点儿理解

理解是就是char** 相当于字符串数组,我以往纠结于该用 **arr还是*arr还是 (*arr),还是(**arr);

对于**arr而言:*arr代表数组的最开头,也就是第一个字串的内容。**arr代表什么,不知道,这么用会报错。

简单的来说arr[0],代表第一个字符串的值,实际指向的整个**arr的首地址,如果用printf之类的处理函数,会把它之后的地址的内容也打印出来,直到找到0。

下面是一个分割字符串的代码,l会保存分割出来的长度。

2014-09-09 结构体数组处理:http://blog.****.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;
}