编辑代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>




typedef struct
{
    char *str;
}str_every;
typedef struct
{
    int num;
    str_every *strbuf;
}o_str;

// o_str out_str;

int analysis_string(char *in_str,o_str *on_str,char ch,int len);
int analysis_string_free(o_str *on_str);

int main () {
    
    char *in_str = "222.222.222.222:30041";
    char *in_str_1 = "222.222.2.2:30041";
    int ret=0;
    int i;
    o_str out_str;
    char test[32] = {0};
    ret = analysis_string(in_str,&out_str,':',strlen(in_str));
    printf("ret = %d\n",ret);
    for(i=0;i<ret;i++)
    {
        
        printf("%s",out_str.strbuf[i].str);
        printf("\n");
    }
    memcpy(test,out_str.strbuf[0].str,strlen(out_str.strbuf[0].str));
    printf("%s\n",test);
    printf("%d\n",strlen(test));
    analysis_string_free(&out_str);
    printf("***************************************\n");
    ret = analysis_string(in_str_1,&out_str,':',strlen(in_str));
    printf("ret = %d\n",ret);
    // for(i=0;i<ret;i++)
    // {
        
    //     printf("%s",out_str.strbuf[i].str);
    //     printf("\n");
    // }
    memcpy(test,out_str.strbuf[0].str,strlen(out_str.strbuf[0].str));
    printf("%s\n",out_str.strbuf[0].str);
    printf("%d\n",strlen(out_str.strbuf[0].str));
    analysis_string_free(&out_str);

    return 0;
}  

/*
in_str:待裁剪的字符串
on_str:裁剪完成后的字符串
ch:分隔符
len:待裁剪字符串的长度
return:裁剪出的字符串个数

*/
int analysis_string(char *in_str,o_str *on_str,char ch,int len)
{
    int i=0,j=0,k=0;

    //1、计算裁剪后的字符串个数
    for(i=0;i<len;i++)
    {
        if(in_str[i] == ch)
        {
            if(i != 0)
            {
                j++;
            }
            continue;
        }
    } 
    on_str->num = j+1;
    on_str->strbuf = (str_every *)malloc(sizeof(str_every)*(on_str->num));
    if(on_str->strbuf == NULL)
    {
        return -1;
    }
    memset(on_str->strbuf,0,sizeof(str_every)*(on_str->num));
    //2、计算每个字符串的长度
    j=0;
    k=0;
    for(i=0;i<len;i++)
    {
        if(in_str[i] == ch)
        {
            if(i != 0)
            {
                on_str->strbuf[j].str = (char *)malloc(sizeof(char)*(i-k+1));
                if(on_str->strbuf[j].str == NULL)
                {
                    return -1;
                }
                memset(on_str->strbuf[j].str,0,sizeof(char)*(i-k+1));
                j++;
            }
            continue;
        }
    }
    on_str->strbuf[j].str = (char *)malloc(sizeof(char)*(i-k+1));
    if(on_str->strbuf[j].str == NULL)
    {
        return -1;
    }
    memset(on_str->strbuf[j].str,0,sizeof(char)*(i-k+1));
    //3、保存裁剪后的字符串
    j=0;
    k=0;
    for(i=0;i<len;i++)
    {
        if(in_str[i] == ch)
        {
            if(i != 0)
            {
                k=0;
                j++;
            }
            continue;
        }
        on_str->strbuf[j].str[k] = in_str[i];
        k++;
    }

    return (j+1);
}

int analysis_string_free(o_str *on_str)
{
    int i=0;
    if(on_str == NULL)
    {
        return 0;
    }
    if(on_str->strbuf == NULL)
    {
        return 0;
    }
    for(i=0;i<on_str->num;i++)
    {
        if(on_str->strbuf[i].str != NULL)
        {
            free(on_str->strbuf[i].str);
            on_str->strbuf[i].str == NULL;
        }
    }
    free(on_str->strbuf);
    on_str->strbuf = NULL;
    return 0; 
}