将字符串解析为单独的元素

时间:2012-01-02 20:26:50

标签: c string-parsing

gcc 4.6.2 C89

我只是想知道这是否是解析字符串以从单个sdp字符串中获取单个元素的好方法。

这是字符串:

"v=0\no=sjphone 853596844 1765236571 IN IP4 10.10.10.10\ns=-\nc=IN IP4 10.10.10.10\nt=0 0\nm=audio 19112 RTP/AVP 8\na=rtpmap:8 PCMA/8000\na=ptime:20\n"

我想把它分开:

v=0
o=sjphone 853596844 1765236571 IN IP4 10.10.10.10
s=-
c=IN IP4 10.10.10.10
t=0 0
m=audio 19112 RTP/AVP 8
a=rtpmap:8 PCMA/8000
a=ptime:20

这是我的代码:

void parse_sdp_string(const char *sdp_string)
{
#define MAX_NUM_ELEMENTS 16    
    char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN] = {{0}};
    apr_size_t element_count = 0;
    apr_size_t i = 0;
    apr_size_t k = 0;

    char sdp_str[MAX_NUM_ELEMENTS * MAX_STRING_LEN] = {0};
    char *search_str = NULL;

    /* Copy the string as to not corrupt the original */
    apr_cpystrn(sdp_str, sdp_string, sizeof sdp_str);
    search_str = sdp_str;

    /* Find the last carriage return to compare that we are at the last one */
    char *end_ptr = strrchr(search_str, '\n');

    /* Increment until you find a carriage return */
    while(*search_str != '\0') {
        /* Fill the element in the array */
        elements[i][k++] = *search_str;
        search_str++;

        /* nul terminate and reset before starting copy next element */
        if(*search_str == '\n') {
            elements[i][++k] = '\0';
            /* Next element */
            i++;
            /* Set back to zero to copy from */
            k = 0;

            /* Check that we are not at the last '\n' */
            if(search_str == end_ptr) {
                /* This is the end, record the number of elements copied */
                element_count = i;
                break;
            }

            /* skip over the current \n as we don't need to copy that */
            search_str++;
        }
    }
}

非常感谢任何建议,

3 个答案:

答案 0 :(得分:4)

我会考虑使用strtok()。它会为你节省很多代码。

答案 1 :(得分:1)

使用sscanf()

有了它,你可以做以下事情:

int i, n;
float x;
char name[50];
n = sscanf("25 54.32E-1 Hamster", "%d%f%s", &i, &x, name);

导致i = 25,x = 54.32E-1,name =“Hamster”。

答案 2 :(得分:1)

使用strtokstrstr等功能可以让您的生活更轻松。实际上,几乎所有属于string.h的“搜索”组的东西都可以使用。