按照指定字符分割字符串,并返回结果

时间:2023-01-03 11:29:56

1:编译环境

[test]$ g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[test]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)

 2:示例代码

/* 文件名: getSubStr.cc
 * 功能说明:按照指定字符分割字符串,并返回结果
 * g++ -o getSubStr getSubStr.cc
 * gcc -o getSubStr getSubStr.cc
 编译环境
[test]$ g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[test]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)
 *
 */
#include <cstdio>
#include <stdlib.h>
#include <string.h>

/* 定义log输出宏 */
#define DEB_LOG(fmat,...)  printf("%s:%d_%s()]"fmat"\n", \
    __FILE__, __LINE__, __FUNCTION__,##__VA_ARGS__)

/* 将字符串以按照指定字符分割,并返回结果 */
/* srcStr   :输入参数,源字符串
 * splitChar:输入参数,分割字符
 * columnLen:输出参数,各子字符串的长度
 * columnStr:输入参数,各子字符串
 * columnNum:输入出参数,输入最大子字符串的最大个数,输出子字符串的实际个数
 */
int getSubStr(char* srcStr, char splitChar, int columnLen[],\
        char columnStr[][50],
        int* columnNum);

int main(int argc, char* argv[]) {
    char srcStr[1024] = ",123,456,789,ab,cd,ef,g,";
    int columnLen[20];
    char columnStr[20][50];
    memset(columnStr, 0x00, sizeof(columnStr));
    int columnNum = sizeof(columnLen)/sizeof(int);
    int ret = getSubStr(srcStr, ',', columnLen, columnStr, &columnNum);
    if(0 != ret){
        DEB_LOG("%s NG", "getSubStr");
        return -1;
    }

    /* 显示子字符串 */
    DEB_LOG("%s", "start show result");
    for (int i = 0; i < columnNum; ++i) {
        DEB_LOG("strVal[%d] = %s", i, columnStr[i]);
    }
    return 0;
}

int getSubStr(char* srcStr, char splitChar, int columnLen[],\
        char columnStr[][50],
        int* columnNum) {
    if (NULL == srcStr || NULL == columnStr || NULL == columnNum) {
        return -1;
    }
    DEB_LOG("columnStr[%d] = %d", *columnNum-1, sizeof(columnStr[*columnNum-1]));

    // get value  split by ','
    char* pStart = srcStr;
    char* pEnd = NULL;
    int i = 0;
    char* bufEnd = pStart + strlen(srcStr);
    while (pStart < bufEnd) {
        pEnd = strchr(pStart, splitChar);
        if (NULL == pEnd) { // last char is not ,
            pEnd = bufEnd;
        }
        if (i < *columnNum) {
            columnLen[i] = pEnd - pStart;
            memcpy(columnStr[i], pStart, columnLen[i]);
        } else {
            DEB_LOG("subStr num > max Num[%d]", *columnNum);
            return -1;
        }
        pStart = pEnd + 1;
        ++i;
    }

    /* 判断最后一个字符是否为分割字符 */
    if (splitChar == *(bufEnd - 1)) {
        if (i < *columnNum) {
            columnLen[i] = 0;
            columnStr[i++][0] = '\0';
        } else {
            DEB_LOG("subStr num > max Num[%d]", *columnNum);
            return -1;
        }
    }
    *columnNum = i;
    return 0;
}

 

 3:输出结果

test.cc:61_getSubStr()]columnStr[8] = 50
test.cc:48_main()]start show result
test.cc:50_main()]strVal[0] = 
test.cc:50_main()]strVal[1] = 123
test.cc:50_main()]strVal[2] = 456
test.cc:50_main()]strVal[3] = 789
test.cc:50_main()]strVal[4] = ab
test.cc:50_main()]strVal[5] = cd
test.cc:50_main()]strVal[6] = ef
test.cc:50_main()]strVal[7] = g
test.cc:50_main()]strVal[8] =