char*分析/解析

char*分析/解析,c,parsing,char,C,Parsing,Char,我有一个字符*包含下面的消息。“movie.mjpeg”名称的长度可变。如何分析char*,以便将电影名称和CSeq编号保存在另一个变量中,然后丢弃char* 安装电影.Mjpeg RTSP/1.0 CSeq:1 传输:RTP/TCP;interleaved=0您可以标记字符串以提取特定字段,例如: #include <stdio.h> #include <stdlib.h> #include <string.h> char inpStr[] = "SETU

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

安装电影.Mjpeg RTSP/1.0 CSeq:1
传输:RTP/TCP;interleaved=0

您可以标记字符串以提取特定字段,例如:

#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;
}
基本上,每次调用
strtok
都将为您提供下一个标记的地址,并以适当的分隔符分隔。调用strdup(a)将确保获得字符串的副本,而不是指向原始字符串的指针。使用指向原始字符串的指针意味着对其中一个字符串的更改将影响另一个字符串

请记住,这会改变原始字符串,因此,如果您不希望这样,请确保使用副本



(a) 标准C不提供strdup,尽管它在许多实现中都可用。如果您的实现没有静态字段,请参见。

假设静态字段实际上是静态的,您可以使用
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()
的返回值,以确保它在转换所有字段时真正成功,这是一个好主意,否则您不能依赖当前的值。

如果您可以描述其他部分可能包含的内容,这将有所帮助。没有进一步的背景很难说。谢谢你,paxdiablo,太棒了。
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);
}