C++解析一些特殊符号Tab、换行符号

开发 后端
我们经常会遇到一些Linux内核信息需要,比如一个wifi数据,中间是用tab键盘隔开的,然后每一行用换行符进行区分。

[[398927]]

前言:

我们经常会遇到一些Linux内核信息需要,比如一个wifi数据,中间是用tab键盘隔开的,然后每一行用换行符进行区分,如下所示的数据

第一位置是:wifi名称 第二个位置是:信号强度 第三个位置是:信号类型2.4Ghz或者5Ghz 第四个位置是:加密类型 第五个类型是:MAC地址

遇到这样的数据,我们比较常见的C函数解析是用while循环去匹配字符串里面的'\t'(tab键),'\n'(换行符号)等,然后用C标准库里面str函数,例如strncpy进行复制或者strstr去查找,类似于下面所示:

  1. int i, j ; 
  2.  i = 0; 
  3.  j = strlen(strIn) - 1; 
  4.  while(strIn[i] == ' ' || strIn[i] == '\t'
  5.          ++i; 
  6.  
  7.  while(strIn[j] == ' ' || strIn[j] == '\t'
  8.          --j; 
  9.  strncpy(strOut, strIn + i , j - i + 1); 

那么我们怎么用C++解析呢,最近刚好解析了部分wifi信息,所以给大家分享哈这部分。

解析代码

对应上面的wifi信息的表,我们看到了一行有五个数据,这时候打包收到了一个string类型的wifi信息。

第一件事情,我们先确认好解析的范围,即知道最开始一位和最后一位,设置好recivemsg.begin 和 recivemsg.

第二件事情,进行识别tab符号和换行符号之后进行分段

第三件事情,把分好的数据塞到一个vector容器里面,然后因为每一行都有五个数据,所以我们就可以按照0~5一组的数据进行分发给各处。

实际C++代码如下:

  1. vector<string> Parse_Wifi_List(string& msg) 
  2.         vector<string> words; 
  3.         if(msg.empty()) 
  4.             return words; 
  5.         string::iterator temp_p = msg.begin(); 
  6.         string sepword; 
  7.         bool bit_true = false
  8.         while(temp_p != msg.end()) 
  9.         { 
  10.             if(/* * temp_p == ' ' || */  * temp_p == '\t' || * temp_p == '\n'
  11.             { 
  12.                 if(bit_true) 
  13.                 { 
  14.                     words.push_back(sepword); 
  15.                     PP_INFO("seword :%s",sepword.c_str()); 
  16.                     sepword.clear(); 
  17.                 }    
  18.                 bit_true = false
  19.                 temp_p++; 
  20.                 continue
  21.             } 
  22.             else 
  23.             { 
  24.                 bit_true = true
  25.                 sepword += *temp_p; 
  26.             } 
  27.             if(*temp_p ++ == '\0'
  28.             { 
  29.                 break; 
  30.             } 
  31.             // else 
  32.             // { 
  33.             //  PP_INFO("%d %d %c",msg.end(),*temp_p,*temp_p); 
  34.             // } 
  35.         } 
  36.         // for(auto point : words) 
  37.         // { 
  38.         //  printf(".%s\n",point.c_str()); 
  39.         // } 
  40.       //for(uint16_t i =0;i<words.size();i+=5) 
  41.       //{ 
  42.         // printf("[]%s,%s\n",words[i].c_str(),words[i+1].c_str(),words[i+3].c_str()); 
  43.         //} 
  44.         return words; 
  45.     } 

使用此代码解析LOG如下:

结语

这就是我分享的一个简单的C++解析一些特殊符号的实践,如果大家有更好的想法和需求,也欢迎大家加我好友交流分享哈。

本文转载自微信公众号「羽林君」,可以通过以下二维码关注。转载本文请联系羽林君公众号。

 

作者:良知犹存,白天努力工作,晚上原创公号号主。公众号内容除了技术还有些人生感悟,一个认真输出内容的职场老司机,也是一个技术之外丰富生活的人,摄影、音乐 and 篮球。关注我,与我一起同行。

 

责任编辑:武晓燕 来源: 羽林君
相关推荐

2014-08-01 17:12:14

Linux特殊符号

2009-09-02 14:30:35

C#换行符号

2010-06-23 17:21:30

Linux Bash

2009-11-25 09:23:47

PHP引用&符号

2011-07-19 13:49:19

Objective-C 数据类型

2010-03-11 17:57:48

Python正则表达式

2014-03-17 10:10:58

CC++编程书籍

2013-06-03 09:45:53

R语言

2010-06-28 18:52:49

UML关系符号

2010-06-12 12:40:59

UML类图符号

2011-08-10 15:58:12

WPS符号栏

2011-11-11 16:02:39

2010-06-12 12:48:36

UML类图符号

2010-08-17 10:16:37

DIV样式

2010-07-12 15:16:29

UML关联

2010-05-28 14:44:42

Linux开发工具

2009-09-02 14:47:44

C#换行符

2009-09-03 15:50:20

C#回车换行符

2011-08-31 18:28:55

MTK

2010-07-08 16:07:02

UML组件图
点赞
收藏

51CTO技术栈公众号