C语言提取被特定字符分隔的字符串中的内容

时间:2024-03-04 12:35:21

C语言中通常可以使用sscanf与strtok进行对制定的分隔符进行分割。sscanf函数的缺陷是对于1;2;3;;;4这样分割符中间没有值的情况处理不好(sscanf(str, "%*[^;];%[^;]",a))。可能存在其它的方式进行分割,目前不对此讨论。

typedef struct split_str_struct
{
    char *str;
    unsigned short length;
}SPLITSTRUCT;

以上声明一个字符串分割结构体,用作字符分割用。

字符分割函数:

static  unsigned short StringSplit(char *instr, char *token, SPLITSTRUCT *out_strs)
{
    char *start = instr;
    char *end = NULL;
    int ind = 0;

    if(!instr || !instr[0])
        return -1;

    end = strstr(start, token);
    while(end != NULL) {
        out_strs[ind].str = start;
        out_strs[ind].length = end - start;

        ind ++;
        start = end + strlen(token);
        end = strstr(start, token);
    }
    out_strs[ind].str = start;
    out_strs[ind].length = strlen(start);

    return ind + 1;
}

使用时,首先定义个结构体数组,其数组大小视能分割出多少内容而定。

 SPLITSTRUCT sub_strings[10]; 

然后调用函数。并且提取其中的内容,假设我们要提取使用;分割的第二与第三个内容。

    char tmp1[MAX_LEN + 1] = {0};   
    char tmp2[MAX_LEN + 1] = {0};         
    StringSplit(buffer, ";", sub_strings);
    if (sub_strings[1].length > 0 || sub_strings[1].length < MAX_LEN) {
        strncpy(tmp1, sub_strings[1].str, sub_strings[1].length);
        tmp1[sub_strings[1].length] = \'\0\';
    }
    if (sub_strings[2].length > 0 || sub_strings[2].length < MAX_LEN) {
        strncpy(tmp2, sub_strings[2].str, sub_strings[2].length);
        tmp2[sub_strings[2].length] = \'\0\';
    }    

即可提取出内容。