c函数sscanf的高级技巧
作者:互联网
在解析url过程中,有时需要非常简单的分解,这时候可以使用几种方法
例如
const char *url = “http://192.168.1.144:1551/AVTransport/cff47b40-2475-7ff1-7459-318ec45c9853/control.xml”;
把这个字符串分解成为
http://192.168.1.144:1551 和
/AVTransport/cff47b40-2475-7ff1-7459-318ec45c9853/control.xml
如何做才是效率最高的
1 regex
这个毋庸置疑非常方便,使用c++的regex也是可以的,其他语言都有这种类似的方法,缺陷是要记住公式一样去使用regex
2 sscanf
这个和regex是类似的,感觉不是很好,但是熟练的情况下推荐使用
定义一个数据结构
typedef struct s_url
{
/*
1
ws://host:port/live/home?flag=push&id=1001
2
/live/id?flag=push?id= 1001
*/
char m_host[32];
int m_port;
char m_app[32];
char m_id[32];
char m_para[1024];
}s_url;
接下去使用sscanf来匹配字符和字符串
int main()
{
const char *url = "http://192.168.1.144:1551/AVTransport/cff47b40-2475-7ff1-7459-318ec45c9853/control.xml";
const char *pos = url;
char buffer1[256] = {0};
char buffer2[256] = {0};
const char *pos = url;
if (*(pos + 4) == ':')
pos += 7;
s_url surl;
sscanf(pos, "%[^:/]:%d/%[^:/]/%[^:?]", surl.m_host, &surl.m_port,
surl.m_app, surl.m_id);
cout << surl.m_host << endl << surl.m_port << endl;
cout << surl.m_app << endl;
cout << surl.m_id << endl;
}
//更简单地方式
int main()
{
const char *url = "http://192.168.1.144:1551/AVTransport/cff47b40-2475-7ff1-7459-318ec45c9853/control.xml";
const char *pos = url + 7;
int port;
sscanf(pos, "%[^:/]:%d/%s", buffer1, &port, buffer2);
cout << buffer1 << endl;
cout << buffer2 << endl;
cout << port << endl;
return 0;
}
3、手写
不使用函数,手写是最好的,最容易理解,锻炼自己的逻辑思维
int main()
{
const char *url = "http://192.168.1.144:1551/AVTransport/cff47b40-2475-7ff1-7459-318ec45c9853/control.xml";
char buffer1[256] = {0};
char buffer2[256] = {0};
const char *pos = url;
if (*(pos + 4) == ':')
pos += 7;
const char *end = url + strlen(url);
for (; pos < end; pos++)
{
if (*pos == '/')
{
size_t l1 = pos - url;
strncpy(buffer1, url, l1);
buffer1[l1] = '\0';
size_t l2 = end - pos;
strncpy(buffer2, pos, l2);
buffer2[l2] = '\0';
break;
}
}
cout << buffer1 << endl;
cout << buffer2 << endl;
}
以上方法很简单地分割了url,如果需要更加细致,可以封装。
标签:xml,sscanf,技巧,url,pos,192.168,char,const,函数 来源: https://blog.csdn.net/qianbo042311/article/details/117967948