将字符串解析为单独的字符串

时间:2011-12-08 11:03:24

标签: c parsing

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

非常感谢任何建议,

5 个答案:

答案 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内存。