gcc 4.6.1 c89
我有一个我需要解析的字符串。字符串是sdp信息。我试图将每个元素分成单独的字符串。
基本上字符串会包含以下内容:
v=0 o=sip_user IN 10230 22472 IP4 10.10.10.44 s=SIP_CALL c=IN IP4 10.10.10.44 m=audio 49152 RTP/AVP 0 8 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000
我想将它们分成不同的字符串。所以这需要分解为单独的字符串。
str1 v=0
str2 o=sip_user IN 10230 22472 IP4 10.10.10.44
str3 s=SIP_CALL
str4 c=IN IP4 10.10.10.44
str5 m=audio 49152 RTP/AVP 0 8
str6 a=rtpmap:0 PCMU/8000
str7 a=rtpmap:8 PCMA/8000
我试图做这样的事情作为开始。但即使它发现v =我需要在下一行开始时找到它。
char *str_v = NULL
str_v = strstr(sdp_string, "v=");
if(str_v != NULL) {
printf("found line: [ %s ]", str_v);
}
非常感谢任何建议,
答案 0 :(得分:2)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char source[] ="v=0 o=sip_user IN 10230 22472 IP4 10.10.10.44 s=SIP_CALL c=IN IP4 10.10.10.44 m=audio 49152 RTP/AVP 0 8 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000";
char *str[7];
char *pf=source, *ps;
int i;
for(i=0;i<7;i++){
pf = strchr(pf, '=');
ps = strchr(pf+1, '=');
if(ps == NULL)
ps = source + sizeof(source)/sizeof(char);
else
ps -=2;
pf -= 1;
str[i]=(char*)malloc((ps - pf + 1)*sizeof(char));
strncpy(str[i], pf, ps - pf);
pf+=2;;
}
for(i=0;i<7;i++)
printf("str%d %s\n", i+1, str[i]);
for(i=0;i<7;i++)
free(str[i]);
return 0;
}
答案 1 :(得分:2)
首先,找到所有子串的开头(下面是parts
数组),然后null终止每个子串。这只是为了表明如果格式是固定的,解析是多么简单。
#include <stdio.h>
#include <string.h>
int main() {
char input[] = "v=0 o=sip_user IN 10230 22472 IP4 10.10.10.44 s=SIP_CALL c=IN IP4 10.10.10.44 m=audio 49152 RTP/AVP 0 8 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000";
char *parts[16] = {0};
int top = 0;
int i;
char *s = input;
while (top < 15 && (s = strchr(s, '='))) { /* find each = and save a pointer to before it */
parts[top++] = s-1;
s++;
}
for (i = 1; parts[i]; i++)
parts[i][-1] = '\0'; /* null terminate each part */
for (i = 0; parts[i]; i++)
printf("%s\n", parts[i]);
return 0;
}
答案 2 :(得分:1)
使用strtok
http://husnusensoy.wordpress.com/2007/01/13/strtok-for-c-guys/
您可以使用strtok
分割空格,然后再在该循环中拆分=
的
答案 3 :(得分:1)
strtok
是合理的。
答案 4 :(得分:1)
使用strchr
查找'='
,然后从该点向后搜索到第一个空格。然后你知道下一个字符串何时开始。使用strndup
(而不是函数名中的'n')来创建字符串。继续,直到您到达原始字符串的末尾。
如果您使用strndup
或任何其他功能来分配内存,请记得稍后free
内存。