char *分析/解析

时间:2013-04-03 07:07:58

标签: c parsing char

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

设置movie.Mjpeg RTSP / 1.0 CSeq:1 运输:RTP / TCP;交织= 0

2 个答案:

答案 0 :(得分:1)

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

#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)的调用将确保您获得字符串的副本,而不是指向原始字符串的指针。使用指向原始字符串的指针意味着改变一个会影响另一个。

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


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

答案 1 :(得分: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()的返回值以确保它在转换所有字段时确实成功,这是一个好主意,否则您不能依赖于存在的值。