2011-12-08 90 views
1

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

非常感谢您的任何建议,

+2

您确定要在C中执行此操作吗?听起来像一个好的脚本语言的工作。 –

+0

我不认为这会很困难。只想知道如何开始。谢谢。 – ant2009

回答

2

首先,找到所有子串的开始(下面parts阵列),那么空终止他们每个人。这只是为了说明如果格式是固定的,可以简单地解析它。

#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; 
} 
1

使用strchr找到'=',然后从该点向后搜索到第一个空间。然后你知道下一个字符串何时开始。使用strndup(不是函数名称中的'n')来创建字符串。继续,直到到达原始字符串的末尾。

如果您使用strndup或任何其他功能分配内存,请记住以后的内存free

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