2013-04-03 82 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是一個好主意,否則你不能依賴於存在的價值。