#include "string.h"
#include "stdio.h"
//遍历扫描字符串中字符出现的个数
int Scan_Charnum(char *str,int *char_count,char c)
{
int num = 0;
char *temp_str = str;
char *temp;
if (str == NULL || char_count == NULL || c == NULL)
return -1;
while (1)
{
// 返回该字符出现的第一次的地址
temp_str = strchr(temp_str, c);
if (temp_str != NULL)
{
// 移到下一个字符
temp_str = temp_str + 1;
num++;
}
else
{
break;
}
}
*char_count = num;
return 1;
}
//扫描字符并动态分配相应的内存空间大小
int Scan_Char_Eachrow(char *str,char c)
{
}
// 二级指针内存分配
int Assign_Mem(char *str,char ***p,int num,char c)
{
char **temp;
int i = 0;
int row_num;
char *temp_str;//存放传过来的指针防止被改变
char *temp2;
int ret = 1;
temp_str = str;
// 先动态分配内存块存在的空间的首地址
temp = (char **)malloc(sizeof(char *)*num);
// 内存空间不足
if (temp == NULL)
{
ret = -1;
goto END;
}
memset(temp, 0, num*sizeof(char *));
for (i = 0; i < num ; i++)
{
// 获取逗号出现的首地址
temp2 = strchr(temp_str, c);
if (temp2 == NULL)
{
temp2 = temp_str + strlen(temp_str);
}
// 要开辟的该行字符数据大小
row_num = temp2 - temp_str;
temp[i] = (char *)malloc(sizeof(char)*(row_num+1));
// 内存空间不足
if (temp[i] == NULL)
{
ret = -1;
goto END;
}
// 开辟内存大小将字符串最后设置'\0'
memcpy(temp[i], temp_str, row_num);
memset(temp[i] + row_num, '\0', 1);
// 将地址向后移一位
temp2++;
temp_str = temp2;
}
END:
if (ret == -1)
{
Free_Mem(&temp, num);
}
else
{
*p = temp;
}
return ret;
}
// 打印字符串
int Print_Str(char **p, int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("%s\n",p[i] );
}
}
// 释放内存
int Free_Mem(char ***p, int num)
{
char **temp;
temp = *p;
int i = 0;
if (p == NULL)
{
return 1;
}
// 先生成的后释放
for (i = 0; i < num; i++)
{
if (p[i] != NULL)
{
free(p[i]);
p[i] = NULL;
}
}
if (temp != NULL)
{
temp = NULL;
free(temp);
}
}
void main()
{
char *p = "aa,cc,dd,343";
int num = 0;//字符出现次数
int row_num = 0;// 实际行数
char c;// 分割字符
char **te=NULL;
int flag_mem;
c = ',';
Scan_Charnum(p, &num, c);
row_num = num + 1;
Assign_Mem(p, &te, row_num, c);
Print_Str(te, row_num);
Free_Mem(te, row_num);
}
两个赋值指针变量挖字符串.c(高级)
最新推荐文章于 2021-10-07 17:58:13 发布