Reputation: 22486
gcc 4.6.2 c89
I am just wondering if this is a good way to parse a string to get the individual elements out of this sdp string.
This is the string:
"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"
And I want to separate it like this:
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
This is my code:
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++;
}
}
}
Many thanks for any suggestions,
Upvotes: 1
Views: 163
Reputation: 686
Using functions like strtok
and strstr
will make your life a lot easier. Actually almost everything that belongs to the "Searching" group of string.h
can be of great use.
Upvotes: 1
Reputation: 12202
Use sscanf().
With it you can do things like:
int i, n;
float x;
char name[50];
n = sscanf("25 54.32E-1 Hamster", "%d%f%s", &i, &x, name);
which results in i = 25, x = 54.32E-1, name = "Hamster".
Upvotes: 1
Reputation: 19443
I would consider using strtok(). It will save you a lot of code.
Upvotes: 4