2012-01-02 3 views
1

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++; 
     } 
    } 
} 

Большое спасибо за любые предложения,

+0

разрешено ли #include ? –

ответ

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, х = 54.32E-1, имя = "Hamster".

4

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

1

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

Смежные вопросы