我有一个包含以下信息的char *。 “movie.mjpeg”名称的长度可变。如何分析char *以便我可以将电影名称和CSeq号码保存在另一个变量中,然后丢弃char *。
设置movie.Mjpeg RTSP / 1.0 CSeq:1 运输:RTP / TCP;交织= 0
答案 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()
的返回值以确保它在转换所有字段时确实成功,这是一个好主意,否则您不能依赖于存在的值。