免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3697 | 回复: 7
打印 上一主题 下一主题

[C++] 如何分割如下的字符串? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-01-23 17:51 |只看该作者 |倒序浏览
各位大佬帮忙看下,如下的字符串:
std::string sub_property="{C_USER_NETWORK_TYPE=0,C_SUB_SALT=89EE043854C7ACCE,C_SMSAlertsFlag=1,C_IS_GROUP_MEMBER=0,C_MBB_NOTIFY_FLAG=2}";

字符串里面保存了用户的相关属性和属性的取值,各个属性以逗号分开,等号左边为参数名称, 右边为参数取值,我想取每个参数和对应的取值,例如参数C_USER_NETWORK_TYPE的取值为0,C_SUB_SALT的取值为89EE043854C7ACCE等等,并且属性的多少根据用户类型的不同也是不一样的

考虑每个字段都是键值的集合,因此把参数和取值放到map容器里面,但是如何能取到每个参数和对应的取值的?

论坛徽章:
0
2 [报告]
发表于 2018-01-23 21:18 |只看该作者
这里好冷清啊,半天都没人回答,也罢,自己胡乱写了一个,也许性能不高,凑合着用吧
  1. void getSubProperty(const std::string &origin_str,std::map<std::string,std::string> &tmap)
  2. {
  3.         /*输入字段:{C_USER_NETWORK_TYPE=0,C_SUB_SALT=89EE043854C7ACCE,C_SMSAlertsFlag=1,C_IS_GROUP_MEMBER=0,C_MBB_NOTIFY_FLAG=2}*/

  4. /*首先去除字符串最左边的{和最右边的}符号*/
复制代码


论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2018-01-24 09:30 |只看该作者
本帖最后由 bruceteen 于 2018-01-24 09:32 编辑
  1. #include <iostream>
  2. #include <string>

  3. bool foo( const std::string& s )
  4. {
  5.     static const std::string whitespace = "\t\n\v\f\r "; // 空白字符

  6.     struct // 去除字符串两端的空白字符
  7.     {
  8.         std::string operator()( const std::string& s, size_t left, size_t right ) const
  9.         {
  10.             left = s.find_first_not_of( whitespace, left );
  11.             if( left==std::string::npos || left>=right )
  12.                 return std::string();
  13.             right = s.find_last_not_of(whitespace,right-1)+1;
  14.             return s.substr(left,right-left);
  15.         }
  16.     } trim;

  17.     // 找到首部第一个非空字符
  18.     size_t left = s.find_first_not_of( whitespace );
  19.     if( left==std::string::npos || s[left]!='{' )
  20.         return false;
  21.     ++left;

  22.     // 找到尾部第一个非空字符
  23.     size_t right = s.find_last_not_of( whitespace );
  24.     if( right==std::string::npos || s[right]!='}' )
  25.         return false;

  26.     for( ; left<right; )
  27.     {
  28.         size_t commasign = s.find( ',', left ); // 以逗号分割
  29.         if( commasign == std::string::npos )
  30.             commasign = right;
  31.         {
  32.             size_t equalsign = s.find( '=', left ); // 以等号分割
  33.             if( equalsign==std::string::npos || equalsign>=commasign ) // 没有找到等号
  34.             {
  35.                 std::cout << '\"' << trim(s,left,commasign) << '\"' << '\n';
  36.             }
  37.             else
  38.             {
  39.                 std::cout << '\"' << trim(s,left,equalsign) << '\"' << " = " << '\"' << trim(s,equalsign+1,commasign) << '\"' << '\n';
  40.             }
  41.         }
  42.         left = commasign+1;
  43.     }

  44.     return true;
  45. }

  46. int main( void )
  47. {
  48.     //std::string sub_property = "{C_USER_NETWORK_TYPE=0,C_SUB_SALT=89EE043854C7ACCE,C_SMSAlertsFlag=1,C_IS_GROUP_MEMBER=0,C_MBB_NOTIFY_FLAG=2}";
  49.     std::string sub_property = "{ a=0, b = 1 , c=, =3, , f }";
  50.     foo( sub_property );
  51. }
复制代码


输出
"a" = "0"
"b" = "1"
"c" = ""
"" = "3"
""
"f"

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
4 [报告]
发表于 2018-01-24 20:02 |只看该作者
也胡乱写了一个

prop = C_USER_NETWORK_TYPE      val = 0
prop = C_SUB_SALT       val = 89EE043854C7ACCE
prop = C_SMSAlertsFlag  val = 1
prop = C_IS_GROUP_MEMBER        val = 0
prop = C_MBB_NOTIFY_FLAG        val = 2


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define SIZE 32
  5. typedef struct {
  6.     char prop[SIZE];
  7.     char val[SIZE];
  8. } Map;

  9. void scan(char *, Map **, unsigned *);
  10. int main() {
  11.    
  12.     /* STRING */
  13.     char property[] = "{C_USER_NETWORK_TYPE=0,C_SUB_SALT=89EE043854C7ACCE,C_SMSAlertsFlag=1,C_IS_GROUP_MEMBER=0,C_MBB_NOTIFY_FLAG=2}";
  14.    
  15.     /* MAP */
  16.     Map *map = NULL;
  17.     unsigned size = 0;

  18.     /* SCAN */
  19.     scan(property, &map, &size);

  20.     /* TEST */
  21.     for (int i = 0; i < size; i++) {
  22.         printf("prop = %s\tval = %s\n", map[i].prop, map[i].val);
  23.     }
  24.    
  25.     /* FREE */
  26.     free(map);
  27. }

  28. void scan(char *property, Map **map, unsigned *size) {
  29.     char *p = property;
  30.     while (*p) if (*p++ == '=') ++*size;
  31.     *map = malloc(*size * sizeof(Map));
  32.     unsigned idx = 0;
  33.     p = property + 1;
  34.     p = strtok(p, ",");

  35.     while (p) {
  36.         sscanf(p, "%[^=]=%[^}]", (*map)[idx].prop, (*map)[idx].val);
  37.         idx++;
  38.         p = strtok(NULL, ",");
  39.     }
  40. }
复制代码

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
5 [报告]
发表于 2018-01-26 19:11 |只看该作者
凑合凑合着用吧
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define SIZE 32
  5. typedef struct Map {
  6.     char prop[SIZE];
  7.     char val[SIZE];
  8.     struct Map *next;
  9. } Map;

  10. Map *scan(char *);
  11. void insert(Map **, Map *);
  12. void destroy(Map *);

  13. int main(void) {
  14.     char property[] =    "{C_USER_NETWORK_TYPE=0,C_SUB_SALT=89EE043854C7ACCE,C_SMSAlertsFlag=1,C_IS_GROUP_MEMBER=0,C_MBB_NOTIFY_FLAG=2}";

  15.     Map *map = scan(property);

  16.     /* TEST */
  17.     for (Map *e = map; e; e = e->next) {
  18.         printf("prop = %s\tval = %s\n", e->prop, e->val);
  19.     }

  20.     destroy(map);
  21. }

  22. Map *scan(char *property) {
  23.     Map *map = NULL;
  24.     char *p = strtok(property + 1, ",");

  25.     while (p) {
  26.         Map *e = malloc(sizeof(Map));
  27.         sscanf(p, "%[^=]=%[^}]", e->prop, e->val);
  28.         insert(&map, e);
  29.         p = strtok(NULL, ",");
  30.     }
  31.     return map;
  32. }

  33. void insert(Map **m, Map *e) {
  34.     e->next = *m;
  35.     *m = e;
  36. }

  37. void destroy(Map *m) {
  38.     if (m->next) destroy(m->next);
  39.     free(m);
  40. }
复制代码

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
6 [报告]
发表于 2018-01-26 20:23 |只看该作者
凌风剑 发表于 2018-01-23 17:51
各位大佬帮忙看下,如下的字符串:
std::string sub_property="{C_USER_NETWORK_TYPE=0,C_SUB_SALT=89EE04 ...

发送与接收的字节数必须严格相等。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
7 [报告]
发表于 2018-01-26 20:28 |只看该作者
凌风剑 发表于 2018-01-23 17:51
各位大佬帮忙看下,如下的字符串:
std::string sub_property="{C_USER_NETWORK_TYPE=0,C_SUB_SALT=89EE04 ...

先用strtok分解,为各个子串。
分别对每个子串,对等号进行拆分,分为左部和右部。这个拆分可以使用strtok或正则表达式。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
8 [报告]
发表于 2018-01-30 22:23 |只看该作者
给个纯C的解决方案:

  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>

  4. struct key_value_node
  5. {
  6.         struct key_value_node *previous, *next;
  7.         int key_offset, key_limit;
  8.         int value_offset, value_limit;
  9. };

  10. int nstrchr(const char *s, int off, int lmt, int *o_off, int chr)
  11. {
  12.         for (off; off < lmt; ++off) {
  13.                 if (s[off] == chr) {
  14.                         if (o_off != NULL) {
  15.                                 *o_off = off;
  16.                         }
  17.                         return 0;
  18.                 }
  19.         }
  20.         return -1;
  21. }

  22. int skip_text(const char *s, int off, int lmt, int *o_off, const char *text, int text_len)
  23. {
  24.         if (off + text_len <= lmt) {
  25.                 if (strncmp(s + off, text, text_len) == 0) {
  26.                         if (o_off != NULL) {
  27.                                 *o_off = off + text_len;
  28.                         }
  29.                         return 0;
  30.                 }
  31.         }
  32.         return -1;
  33. }

  34. int skip_until_text(const char *s, int off, int lmt, int *o_off, const char *text, int text_len)
  35. {
  36.         if (off + text_len <= lmt && strncmp(s + off, text, text_len) != 0) {
  37.                 do {
  38.                         ++off;
  39.                 }while (off + text_len <= lmt && strncmp(s + off, text, text_len) != 0);
  40.                 if (o_off != NULL) {
  41.                         *o_off = off + text_len;
  42.                 }
  43.                 return 0;
  44.         }
  45.         return -1;
  46. }

  47. int skip_charset(const char *s, int off, int lmt, int *o_off, const char *text, int text_len)
  48. {
  49.         int i;

  50.         if (off < lmt && nstrchr(text, 0, text_len, &i, s[off]) == 0) {
  51.                 do {
  52.                         ++off;
  53.                 }while (off < lmt && nstrchr(text, 0, text_len, &i, s[off]) == 0);
  54.                 if (o_off != NULL) {
  55.                         *o_off = off;
  56.                 }
  57.                 return i;
  58.         }
  59.         return -1;
  60. }

  61. int skip_until_charset(const char *s, int off, int lmt, int *o_off, const char *text, int text_len)
  62. {
  63.         int i;

  64.         if (off < lmt && nstrchr(text, 0, text_len, &i, s[off]) != 0) {
  65.                 do {
  66.                         ++off;
  67.                 }while (off < lmt && nstrchr(text, 0, text_len, &i, s[off]) != 0);
  68.                 if (o_off != NULL) {
  69.                         *o_off = off;
  70.                 }
  71.                 return i;
  72.         }
  73.         return -1;
  74. }

  75. int free_key_value_table(struct key_value_node *table)
  76. {
  77.         struct key_value_node *node, *node_temp;

  78.         if (table != NULL) {
  79.                 node = table;
  80.                 do {
  81.                         node_temp = node;
  82.                         node = node->next;
  83.                         free(node_temp);
  84.                 }while (node != table);
  85.         }
  86.         return 0;
  87. }

  88. struct key_value_node *get_key_value_table(const char *text, int text_len)
  89. {
  90.         struct key_value_node *table, *node;
  91.         int off;
  92.         int key_off, key_lmt;
  93.         int value_off, value_lmt;
  94.         int retval;

  95.         table = NULL;
  96.         off = 0;
  97.         skip_charset(text, off, text_len, &off, " \t\r\n", 4);
  98.         if (skip_text(text, off, text_len, &off, "{", 1) == 0) {
  99.                 while (off < text_len) {
  100.                         skip_charset(text, off, text_len, &off, " \t\r\n", 4);
  101.                         if (skip_text(text, off, text_len, &off, "}", 1) == 0) {
  102.                                 skip_charset(text, off, text_len, &off, " \t\r\n", 4);
  103.                                 if (off == text_len) {
  104.                                         return table;
  105.                                 }
  106.                                 break;
  107.                         }
  108.                         key_off = off;
  109.                         retval = skip_until_charset(text, off, text_len, &off, " \t\r\n=", 5);
  110.                         if (retval == 4) {
  111.                                 key_lmt = off;
  112.                                 ++off;
  113.                         }else if (retval >= 0) {
  114.                                 key_lmt = off;
  115.                                 skip_charset(text, off, text_len, &off, " \t\r\n", 4);
  116.                                 retval = skip_text(text, off, text_len, &off, "=", 1);
  117.                         }
  118.                         if (retval != -1) {
  119.                                 skip_charset(text, off, text_len, &off, " \t\r\n", 4);
  120.                                 value_off = off;
  121.                                 retval = skip_until_charset(text, off, text_len, &off, " \t\r\n,}", 6);
  122.                                 if (retval >= 4) {
  123.                                         value_lmt = off;
  124.                                         if (retval == 4) {
  125.                                                 ++off;
  126.                                         }
  127.                                 }else if (retval >= 0) {
  128.                                         value_lmt = off;
  129.                                         skip_charset(text, off, text_len, &off, " \t\r\n", 4);
  130.                                         retval = skip_until_charset(text, off, text_len, &off, ",}", 2);
  131.                                         if (retval >= 0) {
  132.                                                 if (retval == 0) {
  133.                                                         ++off;
  134.                                                 }
  135.                                         }
  136.                                 }
  137.                         }
  138.                         if (retval == -1) {
  139.                                 break;
  140.                         }else {
  141.                                 node = (struct key_value_node *)malloc(sizeof(struct key_value_node));
  142.                                 if (node == NULL) {
  143.                                         break;
  144.                                 }
  145.                                 memset(node, 0, sizeof(struct key_value_node));
  146.                                 node->key_offset = key_off;
  147.                                 node->key_limit = key_lmt;
  148.                                 node->value_offset = value_off;
  149.                                 node->value_limit = value_lmt;
  150.                                 if (table == NULL) {
  151.                                         node->previous = node;
  152.                                         node->next = node;
  153.                                         table = node;
  154.                                 }else {
  155.                                         node->previous = table->previous;
  156.                                         node->next = table;
  157.                                         table->previous->next = node;
  158.                                         table->previous = node;
  159.                                 }
  160.                         }
  161.                 }
  162.                 free_key_value_table(table);
  163.         }
  164.         return NULL;
  165. }

  166. int print_key_value_table(struct key_value_node *table, const char *text, int text_len)
  167. {
  168.         struct key_value_node *node;

  169.         printf("{\n");
  170.         if (table != NULL) {
  171.                 node = table;
  172.                 do {
  173.                         printf("\t%.*s = %.*s\n", node->key_limit - node->key_offset, text + node->key_offset
  174.                                 , node->value_limit - node->value_offset, text + node->value_offset);
  175.                         node = node->next;
  176.                 }while (node != table);
  177.         }
  178.         printf("}\n");
  179.         return 0;
  180. }

  181. int main(void)
  182. {
  183.         const char *text = "{C_USER_NETWORK_TYPE=0,C_SUB_SALT=89EE043854C7ACCE,C_SMSAlertsFlag=1,C_IS_GROUP_MEMBER=0,C_MBB_NOTIFY_FLAG=2}";
  184.         struct key_value_node *table;
  185.         int text_len;

  186.         text_len = strlen(text);
  187.         table = get_key_value_table(text, text_len);
  188.         if (table != NULL) {
  189.                 print_key_value_table(table, text, text_len);
  190.                 free_key_value_table(table);
  191.         }
  192.         return 0;
  193. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP