注意的是在这个知识点中一定要分清在内存的分配方式,其次是在传递指针时一定时的多级指针问题
注意memset(mydest, 0, countsizeof(char));该语句用于重置指针使得其指向NULL,方便后续内存管理
void dig_character(char *p, char ***dest, char Separator,int *ncount){
char *ptail,*ppre;
int count=0;
ptail = p;
ppre = p;
//第一次扫描,扫描出需要申请的行数
while(*ptail!='\0'){
//strchr()返回的是一个指针
ptail = strchr(ptail, Separator);
if(ptail!=NULL){
if(ptail-ppre>0){
count++;
}
ptail=ptail+1;
ppre=ptail;
} else{
break;
}
}
*ncount=count+1;
//然后依据找出来的count分配内存(行数)
char ** mydest = *dest;
mydest = (char**)malloc(count*sizeof(char*));
//然后使用memeset将分配的指针指向NULL(也就是0),是指针,最好说明指针的类型,这样可以根据其类型大小来z置为NULL
memset(mydest, 0, count*sizeof(char*));
//然后就是第二次扫描,在第二次扫描时需要分配列的内存大小
//仍然需要两个指针来辅助截取字符串
ptail = p;
ppre = p;
count = 0;
while (*ptail!='\0'){
ptail = strchr(ptail, Separator);
if(ptail!=NULL){
if(ptail-ppre>0){
mydest[count] = (char*)malloc((ptail-ppre+1)*sizeof(char));
strncpy(mydest[count], ppre, ptail-ppre);
mydest[count][ptail-ppre] = '\0';
count=count+1;
ptail=ptail+1;
ppre=ptail;
}
} else{
mydest[count] = (char*)malloc((strlen(ppre)+1)*sizeof(char));
strcpy(mydest[count], ppre);
break;
}
}
*dest = mydest;
}
**
main函数测试部分:
**
char *p = "afsh,hjer,12lo,90qw,erzc";
char **myp;
char Separator = ',';
int count=0;
dig_character(p,&myp, Separator,&count);
for(int i=0;i<count;i++){
printf("%s\n", myp[i]);
}
内存模型图如下所示:
红色虚线部分是变换的双指针,会随着while循环指向不同的字符,通过ppre和ptail两个指针的指向位置不同就可以通过strncpy或者strcpy函数复制字符串到申请的堆区内存中!