2013-04-03 79 views
-2

我有一个char *,其中包含以下消息。 “movie.mjpeg”名称的长度是可变的。如何分析char *,以便我可以将电影的名称和CSeq编号保存在另一个变量中,然后丢弃char *。char *分析/解析

SETUP movie.Mjpeg RTSP/1.0 的Cseq:1个 交通:RTP/TCP;交错= 0

+0

如果您可以请描述其他部件可能包含的内容,这将有所帮助。没有进一步的背景很难说清楚。 – 2013-04-03 07:09:21

回答

1

可以tokenise一个字符串,提取特定的领域,如用:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char inpStr[] = "SETUP movie.Mjpeg RTSP/1.0 CSeq: 1" 
       " Transport: RTP/TCP; interleaved=0"; 

int main (void) { 
    char *name, *cseq; 

    strtok (inpStr, " ");     // SETUP 
    name = strdup (strtok (NULL, " ")); // movie.Mjpeg 

    strtok (NULL, " ");     // RTSP/1.0 
    strtok (NULL, " ");     // CSeq: 
    cseq = strdup (strtok (NULL, " ")); // 1 

    printf ("Name is [%s], cseq is [%s]\n", name, cseq); 

    free (name); 
    free (cseq); 

    return 0; 
} 

的这个输出是:

Name is [movie.Mjpeg], cseq is [1] 

基本上,每次调用strtok会给你下一个令牌的地址,适当分隔。 strdup(a)的调用将确保您获得字符串的副本,而不是指向原始字符串的指针。使用指向原始字符串的指针意味着更改一个会影响另一个。

请记住,这改变了原来的字符串,所以,如果你不想这样做,请确保你使用副本。


(一)标准C不提供strdup虽然它在许多实现可用。如果您的实施没有,请参阅here

+0

谢谢paxdiablo,那真是太棒了。 –

0

假设静态字段确实是静态的,您可以使用sscanf()扫描出可变部分。

这有益于(?)不依赖strtok()这是一种可怕的功能(它修改输入字符串)。它还允许您在相同的操作中转换非字符串数据,这很方便。

const char *inpStr = "SETUP movie.Mjpeg RTSP/1.0 CSeq: 1 Transport: RTP/TCP; interleaved=0"; 
char filename[128], transport[32]; 
int cseq; 

if(sscanf(inpStr, "SETUP %s RTSP/1.0 CSeq: %d Transport: %s;", 
      filename, &cseq, transport) == 3) 
{ 
    printf("Got filename '%s', cseq=%d, transport='%s'\n", 
     filename, cseq, transport); 
} 

注意检查sscanf()的返回值,以确保将所有字段果然suceededed是一个好主意,否则你不能依赖于存在的价值。