разбирать строку на отдельные строки - PullRequest
1 голос
/ 08 декабря 2011

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 ]

2 голосов
/ 09 декабря 2011

Сначала найдите начало всех подстрок (массив 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;
}
2 голосов
/ 08 декабря 2011
#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 голос
/ 08 декабря 2011

strtok разумно.

1 голос
/ 08 декабря 2011

Используйте strchr, чтобы найти '=', затем ищите в обратном направлении от этой точки до первого пробела.Тогда вы знаете, когда начинается следующая строка.Используйте strndup (не «n» в имени функции) для создания строк.Продолжайте, пока не достигнете конца исходной строки.

Если вы используете strndup или любую другую функцию для выделения памяти, не забудьте free память позже.

1 голос
/ 08 декабря 2011

Используйте strtok http://husnusensoy.wordpress.com/2007/01/13/strtok-for-c-guys/

, вы можете использовать strtok, чтобы разделить пробелы, а затем снова в этом цикле разделить = '*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...