我有一个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