目录
方案一
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
有一个字符串符合以下特征(“abcdef,acccd,eeee,aaaa,e3eeee,ssss,”)
写两个函数(API),输出以下结果
第一个API
1)以逗号分隔字符串,形成二维数组,并把结果传出
2)把二维数组行数运算结果也传出
第二个API
1)以逗号分隔字符串,形成一个二级指针。
2)把一共拆分多少行字符串个数传出
要求:
1, 能正确表达功能的要求,定义出接口。
2, 正确实现接口和功能.
3, 编写正确的测试用例.
*/
int spitString(char *str, char ch, char array[][30], int *count)
{
char *p = str;
char *q = p;
int temp_count = 0;
int len = 0;
if (str == NULL || array == NULL || count == NULL) {
fprintf(stderr, "str == NULL || array == NULL || count == NULL\n");
return -1;
}
//在一个字符串中 找到一个字符 找到了 返回第一个字符的地址, 失败返回NULL
//strchr(母串, 字符)
while ((p = strchr(p, ch)) != NULL) {
//找到了
strncpy(array[temp_count], q, p - q);
array[temp_count][p - q] = '\0';
temp_count++;
p++;
q = p;
if (*p == '\0') {
break;
}
}
if (*q != '\0') {
len = (str + strlen(str)) - q;
strncpy(array[temp_count], q, len);
array[temp_count][len] = '\0';
temp_count++;
}
*count = temp_count;
return 0;
}
int main(void)
{
char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
char array[10][30];
int count = 0;
int retn = 0;
int i = 0;
retn = spitString(str, ',', array, &count);
if (retn < 0) {
fprintf(stderr, "spitString er\n");
return -1;
}
for (i = 0; i < count; i++) {
printf("array[%d]:%s\n", i, array[i]);
}
return 0;
}
方案二
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void free_mem(char ***array_p, int count)
{
char **array = *array_p;
int i = 0;
if (array_p == NULL) {
return;
}
void free(void*);
if (array != NULL) {
for (i = 0; i < count; i++) {
if (array[i] != NULL) {
free(array[i]);
array[i] = NULL;
}
}
free(array);
*array_p = NULL;
}
}
int spitString(char *str, char ch, char ***array_p, int *count)
{
char * p = str;
char * q = p;
int temp_count = 0;
char **array = NULL;
int str_len = 0;
int retn = 0;
if (str == NULL || array_p == NULL || count == NULL) {
fprintf(stderr, " (str == NULL || array_p == NULL || count == NULL)\n");
return -1;
}
//1 求出 字符串中 拆分的个数
while ((p = strchr(p, ch)) != NULL) {
temp_count++;
p++;
q = p;
if (*q == '\0') {
break;
}
}
if (*q != '\0') {
temp_count++;
}
//此时temp_count 就是 子字符串的个数
//2 根据个数开辟指针数组 在堆上
array = (char**)malloc(sizeof(char*)* temp_count);
if (array == NULL) {
fprintf(stderr, "malloc char **array error\n");
retn = -1;
goto END;
}
memset(array, 0, sizeof(char*)*temp_count);
//3 拆分字符串, 为每一个指针开辟堆空间 拷贝字符串
p = str;
q = p;
temp_count = 0;
while ((p = strchr(p, ch)) != NULL) {
//找到了
str_len = p - q;
array[temp_count] = (char*)malloc(sizeof(char)* (str_len+1));
if (array[temp_count] == NULL) {
fprintf(stderr, "malloc array[%d] error\n", temp_count);
retn = -1;
goto END;
}
strncpy(array[temp_count], q, str_len);
array[temp_count][str_len] = '\0';
temp_count++;
p++;
q = p;
if (*p == '\0') {
break;
}
}
if (*q != '\0') {
str_len = (str + strlen(str)) - q;
array[temp_count] = (char*)malloc(sizeof(char)*(str_len + 1));
if (array[temp_count] == NULL) {
fprintf(stderr, "malloc array[%d] error\n", temp_count);
retn = -1;
goto END;
}
strncpy(array[temp_count], q, str_len);
array[temp_count][str_len] = '\0';
temp_count++;
}
if (array != NULL) {
*array_p = array;
*count = temp_count;
}
//释放内存的步骤
END:
if (retn != 0) {
//已经出现错误了
free_mem(&array, temp_count);
}
return 0;
}
int main(void)
{
char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
char **array = NULL;
int count = 0;
int retn = 0;
int i = 0;
retn = spitString(str, ',', &array, &count);
for (i = 0; i < count; i++) {
printf("array[%d]: %s\n", i, array[i]);
}
free_mem(&array, count);
if (array == NULL) {
printf("array kong\n");
}
return 0;
}
方案三
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char** mySpitString( char* buf1, char c, int* count)
{
char* p = NULL;
char* pTmp = NULL;
int tmpcount = 0;
char** myp = NULL;
p = buf1;
pTmp = buf1;
// 第一次求出count
do
{
p = strchr(p, c);
if (p != NULL)
{
if ( p - pTmp > 0 )
{
tmpcount++;
pTmp = p = p + 1;
}
}
else
{
break;
}
} while (*p != '\0');
*count = tmpcount;
//根据多少行精确的分配 内存
myp = (char**)malloc(tmpcount*sizeof(char*));
if (myp == NULL)
{
return NULL;
}
tmpcount = 0;
p = buf1;
pTmp = buf1;
do
{
p = strchr(p, c);
if (p != NULL)
{
//检索符合条件的位置p后移, 形成差值,挖字符串
if (p - pTmp > 0)
{
int len = p - pTmp +1;//分配‘\0’的空间
myp[tmpcount] = (char*)malloc(len*sizeof(char));
if (myp[tmpcount]== NULL)
{
return NULL;
}
strncpy(myp[tmpcount], pTmp, p - pTmp);
myp[tmpcount][p - pTmp] = '\0'; //把一行数据变成c风格的字符串
//让p ptmp达到下一次检索条件
pTmp = p = p + 1;
tmpcount++;
}
}
else
{
break;
}
} while (*p != '\0');
*count = tmpcount;
return myp;
}
int main(void)
{
char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
int ret = 0, k = 0;
char cTem = ',';
int nCount = 0;
char** p = NULL;
p = mySpitString(str, cTem, &nCount);
if (p == NULL)
{
printf("error:%d\n", ret);
return ret;
}
for (size_t i = 0; i < nCount; i++)
{
printf("%s\n", p[i]);
}
//free room
for (size_t i = 0; i < nCount; i++)
{
free(p[i]);
}
free(p);
system("pause");
return 0;
}
方案四
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char** mySpitString( char* buf1, char c, int* count)
{
char* p = NULL;
char* pTmp = NULL;
int tmpcount = 0;
char** myp = NULL;
p = buf1;
pTmp = buf1;
// 第一次求出count
do
{
p = strchr(p, c);
if (p != NULL)
{
if ( p - pTmp > 0 )
{
tmpcount++;
pTmp = p = p + 1;
}
}
else
{
break;
}
} while (*p != '\0');
*count = tmpcount;
//根据多少行精确的分配 内存
myp = (char**)malloc(tmpcount*sizeof(char*));
if (myp == NULL)
{
return NULL;
}
tmpcount = 0;
p = buf1;
pTmp = buf1;
do
{
p = strchr(p, c);
if (p != NULL)
{
//检索符合条件的位置p后移, 形成差值,挖字符串
if (p - pTmp > 0)
{
int len = p - pTmp +1;//分配‘\0’的空间
myp[tmpcount] = (char*)malloc(len*sizeof(char));
if (myp[tmpcount]== NULL)
{
return NULL;
}
strncpy(myp[tmpcount], pTmp, p - pTmp);
myp[tmpcount][p - pTmp] = '\0'; //把一行数据变成c风格的字符串
//让p ptmp达到下一次检索条件
pTmp = p = p + 1;
tmpcount++;
}
}
else
{
break;
}
} while (*p != '\0');
*count = tmpcount;
return myp;
}
void FreeRoomP(char*** p, int count)
{
int i = 0;
char** myp = NULL;
if (p == NULL)
{
return;
}
myp = *p;
if(myp == NULL)
{
return;
}
for (; i < count; i++)
{
if (myp[i] != NULL)
{
free(myp[i]);
}
}
if (myp != NULL)
{
free(myp);
}
*p = NULL; //把实参二级指针,修改为NULL
}
void FreeRoom(char** myp, int count)
{
int i = 0;
if (myp == NULL)
{
return ;
}
for (; i < count; i++)
{
if (myp[i] != NULL)
{
free(myp[i]);
}
}
if (myp != NULL)
{
free(myp);
}
}
char mySpitStr(char* buf1, char c, char*** myp3, int* count)
{
char* p = NULL;
char* pTmp = NULL;
int tmpcount = 0;
char** myp = NULL;
int ret = 0;
p = buf1;
pTmp = buf1;
// 第一次求出count
do
{
p = strchr(p, c);
if (p != NULL)
{
if (p - pTmp > 0)
{
tmpcount++;
pTmp = p = p + 1;
}
}
else
{
break;
}
} while (*p != '\0');
*count = tmpcount;
//根据多少行精确的分配 内存
myp = (char**)malloc(tmpcount*sizeof(char*));
if (myp == NULL)
{
//如果这儿出错已分配 的内存要释放
ret = -2;
printf("here error myp**malloc(tmpcount*sizeof(char*))\n");
goto END;
//return -2;
}
memset(myp, 0, tmpcount*sizeof(char*));
tmpcount = 0;
p = buf1;
pTmp = buf1;
do
{
p = strchr(p, c);
if (p != NULL)
{
//检索符合条件的位置p后移, 形成差值,挖字符串
if (p - pTmp > 0)
{
int len = p - pTmp + 1;//分配‘\0’的空间
myp[tmpcount] = (char*)malloc(len*sizeof(char));
if (myp[tmpcount] == NULL)
{
//如果这儿出错已分配 的内存要释放
ret = -2;
printf("here error (char*)malloc(len*sizeof(char)\n");
goto END;
//return -1;
}
strncpy(myp[tmpcount], pTmp, p - pTmp);
myp[tmpcount][p - pTmp] = '\0'; //把一行数据变成c风格的字符串
//让p ptmp达到下一次检索条件
pTmp = p = p + 1;
tmpcount++;
}
}
else
{
break;
}
} while (*p != '\0');
END:
if (ret !=0)
{
//free room, 只要一个就可以了,其它可以注释了
//free1
FreeRoom(myp, *count);
//free2
FreeRoomP(&myp, *count);
//free3
int i = 0;
if (myp == NULL)
{
return -3;
}
for (; i < tmpcount; i++)
{
if (myp[i] != NULL)
{
free(myp[i]);
}
}
if (myp != NULL)
{
free(myp);
}
}
else
{
*myp3 = myp; //suceess
*count = tmpcount;
}
return ret;
}
int main(void)
{
char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
int ret = 0, k = 0;
char cTem = ',';
int nCount = 0;
char** p = NULL;
//p = mySpitString(str, cTem, &nCount);
//if (p == NULL)
//{
// printf("error:%d\n", ret);
// return ret;
//}
//or
mySpitStr(str, cTem, &p, &nCount);//采用三级指针
for (size_t i = 0; i < nCount; i++)
{
printf("%s\n", p[i]);
}
//free room
for (size_t i = 0; i < nCount; i++)
{
free(p[i]);
}
free(p);
system("pause");
return 0;
}
五方案
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define IN
#define OUT
void free_mem(char ***array_p, int num) // char ****array = &p
{
char **array = *array_p;
int i = 0;
if (array_p == NULL) {
return;
}
if (array == NULL) {
return;
}
for (i = 0; i < num; i++) {
if (array[i] != NULL) {
free(array[i]);
array[i] = NULL;
}
}
free(array);
*array_p = NULL;
}
int sort(IN char *array_1[], int num1,
IN char(*array_2)[30], int num2,
OUT char ***array_3_p, OUT int *num3_p)
{
char **p= NULL;
int num3 = 0;
int retn = 0;
int i = 0;
int j = 0;
int len = 0;
char *temp_p = NULL;
if (array_1 == NULL || array_2 == NULL || array_3_p == NULL || num3_p == NULL) {
fprintf(stderr, "array_1 == NULL || array_2 == NULL || array_3_p == NULL || num3 == NULL\n");
return -1;
}
num3 = num1 + num2; //这个是p3指针所需要第一次开辟的 指针的个数
p = (char**)malloc(sizeof(char*)*num3);
if (p == NULL) {
fprintf(stderr, "malloc char**p3 error\n");
retn = -1;
goto END;
}
memset(p, 0, sizeof(char*)*num3);
//array_1 copy p中
for (i = 0; i < num1; i++) {
len = strlen(array_1[i]);
p[i] = (char*)malloc(sizeof(char)* (len + 1));
memset(p[i], 0, sizeof(char)*(len + 1));
strcpy(p[i], array_1[i]);
}
//array_2 copy p中
for (j = 0; j < num2; j++, i++) {
len = strlen(array_2[j]);
p[i] = (char*)malloc(sizeof(char)*(len + 1));
memset(p[i], 0, sizeof(char)*(len + 1));
strcpy(p[i], array_2[j]);
}
for (i = 0; i < num3; i++) {
printf("p[%d]:%s\n", i, p[i]);
}
//对 p 排序
for (i = 0; i < num3; i++) {
for (j = i; j < num3; j++) {
if (strcmp(p[i], p[j]) > 0) {
temp_p = p[i];
p[i] = p[j];
p[j] = temp_p;
}
}
}
printf("----\n");
for (i = 0; i < num3; i++) {
printf("p[%d]:%s\n", i, p[i]);
}
*array_3_p = p;
*num3_p = num3;
END:
if (retn != 0) {
free_mem(&p, num3);
}
return 0;
}
int main(void)
{
int ret = 0;
char *p1[] = { "aa", "cccccc", "bbbbb" };
char buf2[10][30] = { "111111", "3333", "2222" };
char **p3 = NULL;
int len1, len2,len3, i = 0;
len1 = sizeof(p1) / sizeof(*p1);
len2 = 3;
sort(p1, len1, buf2, len2, &p3, &len3);
free_mem(&p3, len3);
if (p3 == NULL) {
printf("free p3 succ\n");
}
return 0;
}