美文网首页
拆分字符串(两种方法)

拆分字符串(两种方法)

作者: 木鱼_cc | 来源:发表于2018-05-28 20:00 被阅读0次

写两个函数(API),输出以下结果
第一个API
1)以逗号分隔字符串,形成二位数组,并把结果传输
2)把二维数组行数运算结果也传出

第二个API
1)以逗号分隔字符串,形成一个二级指针
2)把一共拆分多少行字符串个数传出

要求:
1.能正确表达功能的要求,定义出接口。
2.正确实现接口和功能
3.编写正确的测试用例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int spitString(char *str,char ch,char array[][30],int *count)
{
    char *p = str;
    char *q = p;
    int temp_count = 0;

     if (str == NULL || array == NULL || count == NULL )
     {      
        fprintf(stderr, "str == NULL || array == NULL || count == NULL\n");
        return -1;
     }
     //在母串中找到一个字符,找到了返回第一个字符的地址,失败返回NULL
    while((p=strchr(p,ch))!=NULL)
    {
          strncpy(array[temp_count][30],q,p-q);
          array[temp_count][p-q] = '\0';
          temp_count++;
          p++;
          q = p;
          if (*p == '\0')break;
    }
    
    if (*q != '\0')
    {
        int 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(int argc, char const *argv[])
{
    char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
    char array[10][30];
    int retn = 0;
    int count = 0;
    retn = spitString(str,',',array,&count);
    if (retn <0)
    {
        fprintf(stderr, "spitString er\n");
    }


    for (int i = 0; i < count; ++i){
     printf("array[%d]:%s\n",i,array[i]);
    }

    return 0;
}

==============================第二种==================================
int spitString(char *str,char ch,char ***array_p,int *count)
{//修改外面的二级指针,需要三级指针
    char *p = str;
    char *q = p;
    int temp_count = 0;
    char **array = NULL

    if (str == NULL || array_p == NULL || count == NULL ){  
        fprintf(stderr, "str == NULL || array == 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++;
     


      
     //2.根据个数开辟指针数组,在堆上
     array = (char **)malloc(sizeof(char*) *temp_count);//这里不懂为什么二级指针是这样!
     if (array == NULL){
          fprintf(stderr, "malloc char **array error\n");
          return -1;
     }
     
     memset(array,0,sizeof(char*)*temp_count);

     //3.拆分字符串,为每一个指针开辟堆空间,拷贝字符串
     p = str;
     q = p;
     temp_count = 0;

     int str_len = 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 char array[%d] error\n",temp_count);
          return -1;
          }
          memset(array[temp_count],0,sizeof(char*)*(str_len+1));
          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 char array[%d] error\n",temp_count);
          return -1;
          }
        strncpy(array[temp_count],q,str_len);
        array[temp_count][str_len] = '\0';
        temp_count++;
     }

     if (array != NULL)
     {
        *array_p = array;
        *count = temp_count;
     }
     return 0;
}

void free_mem(char ***array_p,int count)
{
    char **array = *array_p;
    int i = 0;

   if (array_p == NULL) return ;
    
   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 main(int argc, char const *argv[])
{
    char *str = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
    char **array = NULL;
    int count = 0;
    int retn = 0;

    retn = spitString(str,',',&array,&count);
    for (int i = 0; i < count; ++i)
    {
        printf("array[%d]:%s\n",,i,array[i]);
    }
    free(&array,count);
    return 0;
}



相关文章

网友评论

      本文标题:拆分字符串(两种方法)

      本文链接:https://www.haomeiwen.com/subject/iqknjftx.html