Разбор строки на отдельные элементы - PullRequest
1 голос
/ 03 января 2012

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 ]

4 голосов
/ 03 января 2012

Я бы рассмотрел использование strtok () . Это сэкономит вам много кода.

1 голос
/ 03 января 2012

Использование таких функций, как strtok и strstr сделает вашу жизнь намного проще.Практически все, что принадлежит группе «Поиск» в string.h, может быть очень полезным.

1 голос
/ 03 января 2012

Использование 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".

...