我有一個char *,其中包含以下消息。 「movie.mjpeg」名稱的長度是可變的。如何分析char *,以便我可以將電影的名稱和CSeq編號保存在另一個變量中,然後丟棄char *。char *分析/解析
SETUP movie.Mjpeg RTSP/1.0 的Cseq:1個 交通:RTP/TCP;交錯= 0
我有一個char *,其中包含以下消息。 「movie.mjpeg」名稱的長度是可變的。如何分析char *,以便我可以將電影的名稱和CSeq編號保存在另一個變量中,然後丟棄char *。char *分析/解析
SETUP movie.Mjpeg RTSP/1.0 的Cseq:1個 交通:RTP/TCP;交錯= 0
可以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。
謝謝paxdiablo,那真是太棒了。 –
假設靜態字段確實是靜態的,您可以使用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是一個好主意,否則你不能依賴於存在的價值。
如果您可以請描述其他部件可能包含的內容,這將有所幫助。沒有進一步的背景很難說清楚。 – 2013-04-03 07:09:21