c函数sscanf的高级技巧

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
 }

分解url

 //更简单地方式
 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,如果需要更加细致,可以封装。

以上是关于c函数sscanf的高级技巧的主要内容,如果未能解决你的问题,请参考以下文章

c函数strstr和sscanf组合高级技巧

sscanf高级用法级正则表达式

c语言sscanf截取字符串函数获取后缀名

C语言sscanf()函数详解的代码

sscanf使用小记

sscanf 与 sscanf_s的区别