2011-12-08 116 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; 
}