前言:
我们经常会遇到一些Linux内核信息需要,比如一个wifi数据,中间是用tab键盘隔开的,然后每一行用换行符进行区分,如下所示的数据
第一位置是:wifi名称 第二个位置是:信号强度 第三个位置是:信号类型2.4Ghz或者5Ghz 第四个位置是:加密类型 第五个类型是:MAC地址
遇到这样的数据,我们比较常见的C函数解析是用while循环去匹配字符串里面的'\t'(tab键),'\n'(换行符号)等,然后用C标准库里面str函数,例如strncpy进行复制或者strstr去查找,类似于下面所示:
1
2
3
4
5
6
7
8
9
|
int i, j ;
i = 0;
j = strlen (strIn) - 1;
while (strIn[i] == ' ' || strIn[i] == '\t' )
++i;
while (strIn[j] == ' ' || strIn[j] == '\t' )
--j;
strncpy (strOut, strIn + i , j - i + 1);
|
那么我们怎么用C++解析呢,最近刚好解析了部分wifi信息,所以给大家分享哈这部分。
解析代码
对应上面的wifi信息的表,我们看到了一行有五个数据,这时候打包收到了一个string类型的wifi信息。
第一件事情,我们先确认好解析的范围,即知道最开始一位和最后一位,设置好recivemsg.begin 和 recivemsg.
第二件事情,进行识别tab符号和换行符号之后进行分段
第三件事情,把分好的数据塞到一个vector容器里面,然后因为每一行都有五个数据,所以我们就可以按照0~5一组的数据进行分发给各处。
实际C++代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
vector<string> Parse_Wifi_List(string& msg)
{
vector<string> words;
if (msg.empty())
return words;
string::iterator temp_p = msg.begin();
string sepword;
bool bit_true = false ;
while (temp_p != msg.end())
{
if ( /* * temp_p == ' ' || */ * temp_p == '\t' || * temp_p == '\n' )
{
if (bit_true)
{
words.push_back(sepword);
PP_INFO( "seword :%s" ,sepword.c_str());
sepword.clear();
}
bit_true = false ;
temp_p++;
continue ;
}
else
{
bit_true = true ;
sepword += *temp_p;
}
if (*temp_p ++ == '\0' )
{
break ;
}
// else
// {
// PP_INFO("%d %d %c",msg.end(),*temp_p,*temp_p);
// }
}
// for(auto point : words)
// {
// printf(".%s\n",point.c_str());
// }
//for(uint16_t i =0;i<words.size();i+=5)
//{
// printf("[]%s,%s\n",words[i].c_str(),words[i+1].c_str(),words[i+3].c_str());
//}
return words;
}
|
使用此代码解析LOG如下:
结语
这就是我分享的一个简单的C++解析一些特殊符号的实践,如果大家有更好的想法和需求,也欢迎大家加我好友交流分享哈。
到此这篇关于C++解析特殊符号tab、换行符号的文章就介绍到这了,更多相关C++解析特殊符号内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://mp.weixin.qq.com/s/NCaY9okJQYLBGB56viLr4A